mac compile c++ g++

c++ - compile - ¿Por qué este código de aspecto no válido se compila correctamente en g++ 6.0?



g++ ubuntu (2)

Ejecuté el comando en mi máquina virtual Fedora con g++ versión 5.1.1 y encontré lo siguiente:

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

Sin embargo, eso se las arregló para compilar ... Así que dejé el AST y obtuve esto:

$ 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

Lo cual es demasiado grande para caber dentro de un comentario, pero debería ser útil para determinar lo que está sucediendo. Todavía estoy pasando por esto, pero solo estoy publicando esta información para que otros la construyan.

Que se visualiza así .

Esta pregunta ya tiene una respuesta aquí:

Considere este extraño programa:

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

(Vea una demostración en vivo here y here ).

Aunque falta el comentario // , el código se compila bien sin errores y advertencias, incluso cuando uso -pedantic-errors opciones -pedantic-errors en g ++ 6.0. Esto me parece un error de compilación. ¿Es realmente un error en el compilador?


Esto parece ser un error / característica / problema con g ++ en todas las versiones en las que puedo probarlo. Corriendo

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

En godbolt.org para todas las versiones de g ++ sin banderas de compilación, se godbolt.org el siguiente resultado de ensamblaje.

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

El único diagnóstico que recibo está en godbolt.org y ese es

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

Clang, ICC y MSVS no logran compilar esto.

EDITAR:

De los comentarios, zwol presentó un error con gcc en esto. El informe de error se puede encontrar here .