Почему этот недопустимый код успешно компилируется на g++ 6.0? [дубликат]


этот вопрос уже есть ответ здесь:

рассмотрим эту странную программу:

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

(смотрите демо-версию здесь & здесь.)

хотя комментарий // отсутствует, код компилируется нормально, без ошибок и предупреждений, даже когда я использую -pedantic-errors параметры в g++ 6.0. Это похоже на ошибку компилятора для меня. Это действительно ошибка в компиляторе?

2 83

2 ответа:

Это похоже на ошибку / функцию / проблему с g++ во всех версиях, на которых я могу ее протестировать. Работает

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

On godbolt.org для всех версий g++ без флагов компиляции дают следующий вывод сборки.

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

единственный диагноз, который я получаю, находится на godbolt.org и это

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

Clang, ICC и MSVS все не удается скомпилировать это.

EDIT:

из комментариев zwol подал ошибку с gcc на этом. Отчет об ошибке можно найти здесь.

Я запустил команду на моей виртуальной машине Fedora с g++ версия 5.1.1 и обнаружил следующее:

[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?
       ^

однако это все еще удалось скомпилировать... Так что я сбросил АСТ и получил это:

$ 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.