为什么这个无效的代码在g ++ 6.0上成功编译?

时间:2015-11-09 17:12:43

标签: c++ g++

考虑这个奇怪的程序:

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

(查看实时演示here& here。)

即使缺少评论//,代码编译也没有任何错误&即使我在g ++ 6.0中使用-pedantic-errors选项,也会发出警告。这对我来说似乎是一个编译器错误。它真的是编译器中的一个错误吗?

2 个答案:

答案 0 :(得分:42)

这看起来是我可以在其上测试的所有版本中使用g ++的错误/功能/问题。运行

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

对于没有编译标志的所有g ++版本,在godbolt.org上给出以下程序集输出。

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都无法编译。

编辑:

从评论中zwol提交了一个关于gcc的错误。可以找到错误报告here

答案 1 :(得分:15)

我已使用g++版本5.1.1在我的Fedora VM上运行该命令,并找到以下内容:

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

然而,仍然设法编译......所以我dumped the 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      

哪个太大而不适合评论,但应该有助于确定发生了什么。我仍然经历过这个,但我只是发布这些信息供其他人构建。

可视化为enter image description here