10

GCC v4.8.2 でバグを見つけたかもしれませんが、送信する前にまず確認したいのですが、何か間違っている可能性があります。

次のコード:

#include <vector>
struct Message
{
  typedef union {
    char byte;
    const char *str;
  } Parameter;

  Parameter p1;
  Parameter p2;
};

int main()
{
  std::vector<Message> messages_;

  messages_.push_back({{ .byte = 'a' }});

  Message message = {{ .byte = 'a' }, { .str = "Hello World" }};
  messages_.push_back(message);

  messages_.push_back({{ .byte = 'a' }, { .str = "Hello World" }});
}

clang++ -std=c++11 main.cppこれをうまくコンパイルします。ただしg++、これを出力します:

main.cpp: In function ‘int main()’:
main.cpp:23:66: internal compiler error: in reshape_init_class, at cp/decl.c:5216
   messages_.push_back({{ .byte = 'a' }, { .str = "Hello World" }});
                                                                  ^
Please submit a full bug report,
with preprocessed source if appropriate.
See <http://bugzilla.redhat.com/bugzilla> for instructions.
Preprocessed source stored into /tmp/ccrf5vwr.out file, please attach this to your bugreport.

誰もアイデアを持っていない場合は、これをバグとして提出しますが、私の経験では、プログラマーの問題がコンパイラーのバグであることはほとんどなく、ほとんどの場合、プログラマー自身のせいです!

4

1 に答える 1

4

上記のコメントで回答されているように: GCC から取得したフレーズを含むエラー メッセージは、internal compiler error間違いPlease submit a full bug reportなくコンパイラのバグであり、自分のせいではありません! この場合、バグは、" " に指定された初期化子が含まれる{{ ... }}C++ モードでのGCC の解析に関係しているようです。...@Sam は GCCバグ 59832として報告しています。

ただし、@Angew が指摘したように、この行 —</p>

messages_.push_back({{ .byte = 'a' }});

有効な C++ ではありません。標準 C++ では、指定された初期化子を使用できません。これは、C++ に採用されなかった C99 の機能です (C++11 でも C++14 でもありません)。

指定されたイニシャライザを C++ に追加するのが問題だった理由については、ここを参照しください

struct Foo {int x,y; };
void f(Foo);
void f(std::initializer_list<int>);

int main(){
    f({1});
    f({1,2});
    f({1,2,3});
    f({.x=1});
    f({.x=1,2});
    f({.x=1,2,3});
}

記録として、GCC 4.8 は 6 つすべてを への呼び出しとして扱いますf(initializer_list<int>)。Clang 3.5 は、最初の 3 つを への呼び出しとして扱い、f(initializer_list<int>)次の 2 つをへの呼び出しとして扱いf(Foo)、最後の 1 つを不正な形式として扱います。基本的に、これは非標準の構成要素です。さまざまなコンパイラは、それを異なる方法で処理する権利の範囲内にあり、 .

于 2014-02-10T09:17:38.823 に答える