読者です 読者をやめる 読者になる 読者になる

とくにあぶなくないRiSKのブログ

危ないRiSKのブログだったかもしれない。本当はRiSKだけどググラビリティとか取得できるIDの都合でsscriskも使ったり。

GCC でまた ICE

一日で二つ目とかどういうことだ…。

template<class T>
struct s
{
 s(){}
 s(s &&){}
 template<class U>
 constexpr s(s<U> const &){}
 void f(){s tmp(*this);}
 void g(){s tmp(*this);}
};

int main()
{
 s<int> a;
 a.f();
 a.g();
}

こんなソースを g++.exe (GCC) 4.6.0 20110108 (experimental) に喰わせると

a.cpp: In member function 'void s<T>::g() [with T = int]':
a.cpp:16:6:   instantiated from here
a.cpp:9:22:   in constexpr expansion of 'tmp.s<T>::s [with U = int, T = int]((*(const s<int>*)this))'
a.cpp:9:22: internal compiler error: Segmentation fault
Please submit a full bug report,
with preprocessed source if appropriate.
See <http://gcc.gnu.org/bugs.html> for instructions.

こうなる。なんとセグフォしている。
s(s<U> const &) だけ constexpr なのは,最小コードを作るため。もともとは他のコンストラクタにも constexpr がついていた。
どういうわけか,a.f() と a.g() の両方の呼出しをするとこける。どちらか片方だと複数呼んでもこけない。

さて,

今日はもうめげた。一つ目はコンパイラいじめで見つけたけど,この二つ目は普通のコード書いてて見つけたもので,意欲をそがれたw
誰かに,このバグの件を丸投げしたい。誰か受け取りたい人いませんか?w