Почему этот код недействительного кода успешно компилируется в 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
Что слишком велико, чтобы вписаться в комментарий, но должно быть полезно при определении того, что происходит. Я все еще переживаю это, но я просто размещаю эту информацию для других, чтобы строить из.
Что визуализируется следующим образом
.