リンク
ボレロ村上 - ENiyGmaA Code
C++初心者会で話題になったClangの相互再帰バグについて - ボレロ村上 - ENiyGmaA Code
中3女子です。 歌舞伎座.tech#8「C++初心者会」という勉強会が先日あり、自称初心者やクソザコによるさまざまな発表がおこなわれた。自分は参加できなかったので、いくつかの発表をニコ生で視聴した。 その中に、@wx257osn2 氏による constexpr ラムダライブラリを実装したという発表があった。実装にあたっては Clang のバグに対処するワークアラウンドを書くのに苦労したという。さもありなん。Clang は全体的な規格準拠度ではおおむね GCC 以上といってよいが、constexpr 関係で
Clang の constexpr 関係の致命的なバグとは、相互再帰におけるバグである。相互再帰する constexpr 関数テンプレートを実体化すると、テンプレートインスタンス化が無限再帰してコンパイルエラーになる。具体的には以下のようなコードがエラーとなる。
template<typename T>
constexpr T f(T const&);
template<typename T>
constexpr T g(T const&);
template<typename T>
constexpr T f(T const& val) { return g(val); }
template<typename T>
constexpr T g(T const& val) { return val >= 10 ? val : f(val + 1); }
int main() {
constexpr auto x = f(0);
// [clang version 3.2]
// fatal error: recursive template instantiation exceeded maximum depth of 512
}
yumetodo
@yumetodo
さて、Clangといえば相互再帰バグだが(ぇ、 boleros.hateblo.jp/entry/2015/05/… を実行したところ、治っていた。 画像2枚めはaptで入るclang3.8でのコンパイル結果 pic.twitter.com/GoHxCihTGk
2017-03-19 08:40:26
拡大
拡大
どうも有名な相互再帰バグは治ったと見て良さそうだ。
ちなみにclang3.2から3.9に至るまでバグが残っていた。
Theolizer
@TheorideTech
@yumetodo 後、相互再帰バグは3.9.1で治っている模様。 melpon.org/wandbox/permli… boleros.hateblo.jp/entry/2015/05/… からの流用です。
2017-03-19 12:11:43ninja VS GNUmake
$ time make -j4
real 31m8.339s
user 112m48.940s
sys 5m11.908s
$ time ninja -j4
real 30m0.115s
user 112m21.620s
sys 5m2.788s
微妙にninjaが速いという結果になった。