Почему этот недопустимый код успешно компилируется на g++ 6.0? [дубликат]
этот вопрос уже есть ответ здесь:
рассмотрим эту странную программу:
int main()
{
int(*){} Is it C++14 or any other language?
}
(смотрите демо-версию здесь & здесь.)
хотя комментарий //
отсутствует, код компилируется нормально, без ошибок и предупреждений, даже когда я использую -pedantic-errors
параметры в g++ 6.0. Это похоже на ошибку компилятора для меня. Это действительно ошибка в компиляторе?
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
который слишком велик, чтобы поместиться внутри комментария, но должен быть полезен при определении того, что происходит. Я все еще прохожу через это, но я просто публикую эту информацию для других, чтобы построить.