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

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

GCC 4.6.0 のバグ

CEL の開発中 is_sorted_until を実装していたら g++ のバグを見つけました。
以下,再現コード

constexpr int const * is_sorted_until(int const * first, int const * last)
{
 return first == last || first + 1 == last ? last
  : (*(first + 1) < *first) != false ? first + 1
  : is_sorted_until(first + 1, last);
}

int main()
{
 static constexpr int array[2] = {0, 1};
 constexpr int const * last = is_sorted_until(array, array + 2);
}

実行結果(コンパイルエラー):

a.cpp: In function 'int main()':
a.cpp:11:63:   in constexpr expansion of 'is_sorted_until(((const int*)(& array)), (((const int*)(& array)) + 8u))'
a.cpp:11:63: internal compiler error: in cxx_eval_conditional_expression, at cp/semantics.c:6213
Please submit a full bug report,
with preprocessed source if appropriate.
See <http://gcc.gnu.org/bugs.html> for instructions.

見事, internal compiler error (ICE) を吐いています。不思議なことに

  : (*(first + 1) < *first) != false ? first + 1

  : *(first + 1) < *first ? first + 1

に書き換えるだけでエラーが出なくなります。あるいは呼出す方を書き換えて

 constexpr int const * last = is_sorted_until(array, array + 2);

 constexpr int const * last = is_sorted_until(array, array + 1);

にしてもエラーが出なくなります。なんなんでしょうね?(バグです!)

バグレポート

これを期に人生初のバグレポを出しました。↑のバグレポはこれです!
Bug 48909 - [C++0x] ICE in cxx_eval_conditional_expression, at cp/semantics.c:6213
現状このバグが Confirmed (確認)され,Status: が NEW になっています!やりました!いっぱいはてなスターつけていいです!つけましょう!つけてください!おねがいします!はてなブックマークしてもいいです!トラバでもいいです!ツイートしてもいいです!いいね!でもいいね!
これ以外に,もう二つバグレポも出しました。この後は残りのバグ紹介のエントリを書いて,バグレポについてはそのあとまとめてエントリ書こうかなと思ってます。