Почему этот код недействительного кода успешно компилируется в g++ 6.0?

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

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

(см. живое демо здесь и здесь.)

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

Ответ 1

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

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

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

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 не могут скомпилировать это.

EDIT:

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

Ответ 2

Я запустил команду на моей Fedora VM с помощью g++ version 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?
       ^

Однако это все еще удалось скомпилировать... Так что я сбросил 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      

Что слишком велико, чтобы вписаться в комментарий, но должно быть полезно при определении того, что происходит. Я все еще переживаю это, но я просто размещаю эту информацию для других, чтобы строить из.

Что визуализируется следующим образом введите описание изображения здесь.