Programing

이 유효하지 않은 코드가 g ++ 6.0에서 성공적으로 컴파일되는 이유는 무엇입니까?

lottogame 2020. 9. 19. 11:54
반응형

이 유효하지 않은 코드가 g ++ 6.0에서 성공적으로 컴파일되는 이유는 무엇입니까? [복제]


이 질문에 이미 답변이 있습니다.

이 이상한 프로그램을 고려하십시오.

int main()
{
    int(*){} Is it C++14 or any other language?
}

( 여기여기 에서 라이브 데모를 참조 하십시오 .)

주석 // 없어도 -pedantic-errorsg ++ 6.0에서 옵션을 사용해도 오류와 경고없이 코드가 잘 컴파일됩니다 . 이것은 나에게 컴파일러 버그처럼 보입니다. 정말 컴파일러의 버그입니까?


이것은 내가 테스트 할 수있는 모든 버전에서 g ++의 버그 / 기능 / 문제로 보입니다. 달리는

int main()
{
    int(*){} Is it C++14 or any other language?
}

godbolt.org 없이 컴파일 플래그 g ++의 모든 버전의 어셈블리 OUPUT 다음 제공합니다.

main:
    pushq   %rbp
    movq    %rsp, %rbp
    movl    $0, %eax
    leave
    ret

내가 얻는 유일한 진단은 godbolt.org 에 있습니다.

!!warning: extended initializer lists only available with -std=c++0x or -std=gnu++0x

Clang, ICC 및 MSVS는 모두 이것을 컴파일하지 못합니다.

편집하다:

코멘트에서 zwol 은 이에 대해 gcc에 버그를 제출했습니다. 버그 보고서는 여기 에서 찾을 수 있습니다 .


g++버전을 사용 5.1.1하여 Fedora VM에서 명령을 실행 했으며 다음을 발견했습니다.

[user:~] 1 $ g++ -fdump-tree-original-raw tmp.cpp
tmp.cpp: In function ‘int main()’:
tmp.cpp:3:11: warning: extended initializer lists only available with -std=c++11 or -std=gnu++11
     int(*){} Is it C++14 or any other language?
       ^

그러나 그것은 여전히 ​​컴파일에 성공했습니다 ... 그래서 나는 AST를 버리고 이것을 얻었습니다.

$ cat tmp.cpp.003t.original 

;; Function int main() (null)
;; enabled by -tree-original

@1      return_expr      type: @2       expr: @3      
@2      void_type        name: @4       algn: 8       
@3      init_expr        type: @5       op 0: @6       op 1: @7      
@4      type_decl        name: @8       type: @2       srcp: <built-in>:0      
                         note: artificial 
@5      integer_type     name: @9       size: @10      algn: 32      
                         prec: 32       sign: signed   min : @11     
                         max : @12     
@6      result_decl      type: @5       scpe: @13      srcp: tmp.cpp:1      
                         note: artificial              size: @10     
                         algn: 32      
@7      integer_cst      type: @5      int: 0
@8      identifier_node  strg: void     lngt: 4       
@9      type_decl        name: @14      type: @5       srcp: <built-in>:0      
                         note: artificial 
@10     integer_cst      type: @15     int: 32
@11     integer_cst      type: @5      int: -2147483648
@12     integer_cst      type: @5      int: 2147483647
@13     function_decl    name: @16      type: @17      scpe: @18     
                         srcp: tmp.cpp:1               lang: C       
                         link: extern  
@14     identifier_node  strg: int      lngt: 3       
@15     integer_type     name: @19      size: @20      algn: 128     
                         prec: 128      sign: unsigned min : @21     
                         max : @22     
@16     identifier_node  strg: main     lngt: 4       
@17     function_type    size: @23      algn: 8        retn: @5      
                         prms: @24     
@18     translation_unit_decl 
@19     identifier_node  strg: bitsizetype             lngt: 11      
@20     integer_cst      type: @15     int: 128
@21     integer_cst      type: @15     int: 0
@22     integer_cst      type: @15     int: -1
@23     integer_cst      type: @15     int: 8
@24     tree_list        valu: @2      

댓글에 들어가기에는 너무 크지 만 무슨 일이 일어나고 있는지 판단하는 데 유용해야합니다. 나는 여전히 이것을 겪고 있지만 다른 사람들이 만들 수 있도록이 정보를 게시하고 있습니다.

이렇게 시각화 enter image description here됩니다.

참고URL : https://stackoverflow.com/questions/33614455/why-does-this-invalid-looking-code-compile-successfully-on-g-6-0

반응형