84 votes

Pourquoi cela invalide-la recherche de code à compiler avec succès sur g++ 6.0?

Considérer cette étrange programme:

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

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

Même si le commentaire // est manquant, le code se compile très bien sans toutes les erreurs et avertissements, même lorsque j'utilise -pedantic-errorsoptions dans g++ 6.0. Cela semble être un bug du compilateur pour moi. Est-ce vraiment un bug du compilateur?

42voto

NathanOliver Points 10062

Cela ressemble à un bug/feature/problème avec g++ dans toutes les versions, je peux le tester sur. L'exécution de

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

Sur godbolt.org pour toutes les versions de g++ avec aucun des indicateurs de compilation donner la suite de l'assemblée de sortie.

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

Le seul diagnostic que je reçois est sur godbolt.org et c'est

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

Clang, de la CPI et MSVS tous ne parviennent pas à le compiler.

EDIT:

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

15voto

nonsensickle Points 1672

J'ai exécuté la commande sur ma Fedora VM avec g++ version 5.1.1 et constaté 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 encore réussi à le compiler... Donc je l'ai viré la AST et obtenu 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: <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      

Qui est trop grand pour s'adapter à l'intérieur d'un commentaire, mais devrait être utile dans la détermination de ce qui se passe. Je suis toujours en cours à travers cela, mais je suis juste l'affichage de cette information pour en créer d'autres.

Ce qui est visualisé comme ça enter image description here.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X