Pourquoi ce code non valide se comstack-t-il avec succès sur g ++ 6.0?

Considérez ce programme étrange:

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

(Voir une démo en direct ici et ici .)

Même si le commentaire // est manquant, le code se comstack -pedantic-errors sans erreurs ni avertissements, même lorsque j’utilise les options -pedantic-errors de g ++ 6.0. Cela me semble être un bogue de compilateur. Est-ce vraiment un bogue dans le compilateur?

Cela semble être un problème / fonctionnalité / problème avec g ++ dans toutes les versions que je peux tester. Fonctionnement

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

Sur godbolt.org pour toutes les versions de g ++ sans drapeaux de compilation, donnez la sortie d’assemblage suivante.

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

Le seul diagnostic que je reçois concerne godbolt.org et c’est

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

Clang, ICC et MSVS ne parviennent pas tous à comstackr cela.

MODIFIER:

D’après les commentaires zwol a déposé un bug avec gcc à ce sujet. Le rapport de bogue peut être trouvé ici .

J’ai exécuté la commande sur ma VM Fedora avec g++ version 5.1.1 et j’ai trouvé ce qui suit:

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

Cependant, cela a quand même réussi à comstackr … J’ai donc jeté l’AST et j’ai eu ceci:

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

Ce qui est trop grand pour tenir dans un commentaire mais devrait être utile pour déterminer ce qui se passe. Je suis toujours en train de traverser cela, mais je ne fais que poster cette information pour que les autres puissent la construire.

Qui est visualisé comme ça entrer la description de l'image ici .