Clang4.0をUbuntuでビルドした話

Clang4.0をUbuntuでビルドしようとしたが、やたら時間がかかる。原因は・・・?
2
リンク ボレロ村上 - 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
拡大
拡大
yumetodo @yumetodo

つまり、有名なclangの相互再帰バグは4.0にてfixedということだろうか。

2017-03-19 08:43:50

どうも有名な相互再帰バグは治ったと見て良さそうだ。
ちなみに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:43

ninja VS GNUmake

Theolizer @TheorideTech

@yumetodo ninjaだと1時間か。GNUmakeに比べて速そうですか?

2017-03-19 12:09:09
$ 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が速いという結果になった。