2015-11-09 9 views
83

はこの奇妙なプログラムを検討:コメント//が欠落しているにもかかわらずこの無効なコードがg ++ 6.0で正常にコンパイルされるのはなぜですか?

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

(。here & hereライブデモを参照してください)

を、コードがすべてのエラー&警告なしに罰金コンパイルしてもI g ++ 6.0の-pedantic-errorsオプションを使用してください。これはコンパイラのバグのようです。それは本当にコンパイラのバグですか?

+0

コメント文字の欠如は意図的ですか? –

+0

@ThomasMatthewsどうやら。 –

+1

cygwinでバージョン4.9.3を使って 'g ++ -std = C++ 11 -Wall socc.cc -o socc'でビルドできます。 –

答えて

43

これはテストできるすべてのバージョンでg ++のバグ/機能/問題と思われます。いいえコンパイルフラグを持つグラムのすべてのバージョン++用godbolt.org

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

を実行すると、次のアセンブリ出力リレーを与えます。

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

私が得る唯一の診断はgodbolt.org上にあり、それはクラン、ICCとMSVSはこのすべてをコンパイルに失敗

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

です。

EDIT:

この上のgccでバグを提出しzwolコメントから。バグレポートはhereです。

+3

でコンパイルされません。バグレポートをhttps://gcc.gnu.org/bugzilla/に提出してください。 – zwol

+0

私が言うことができる限り、あなたの分解はシンプルな 'return 0;を示しています。それが何であれ、提供される行は基本的に' no-op'です。何らかの宣言のように扱われなければならない... – nonsensickle

+0

@zwol Bug?配列の初期化として解釈していて、使用されていないためにそれを取り除いているようです。それはどうやってバグですか? –

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のように表示されます。

+12

ASTの視覚化はどのようにしましたか? – HSchmale

+1

@HSchmale ASTのダンプリンクにはレシピがあります –

+2

ダウン回答者は、この回答を改善できるように推論にコメントを残してください。 – nonsensickle

関連する問題