背景
私が作った個人プロダクトの中で、特に宣伝していない割にはそれなりに(見ず知らずの人に)スターを貰って使ってもらえているものがあるのだが、そこにIssueが立った。
internal compiler error with gcc-7.3.1 · Issue #9 · ToruNiina/toml11 · GitHub
ちなみにこれはTOMLという設定ファイルのパーサである。
このIssueは、Arch系でリリースされているgcc-7.3.1
だけで(本家では7.3.0
までしかリリースされていない)生じるInternal Compiler Errorに関するものだ。それまでは出ていなかったICEが非公式リリース7.3.1で突然発生しているのだからコンパイラのバグかと思ったのだが、微妙な処理系依存動作に乗っかっていたのかもしれない。どちらにせよworkaroundできた方がいい。
それで報告されたエラーメッセージを見た所、おそらくSFINAE関係だろうと推測できた。他のライブラリが問題なくコンパイルできているのだとしたら、その箇所でやっていた妙なことといえば、constexpr
関数をtemplateのデフォルト引数に使っていたことだ。
constexpr int func() {} template<typename T, int I = func()> class X{};
というような感じだ。 おそらくここでおかしくなっているのだろうと何の根拠もなく直感した。
そしてboost
などがコンパイルできるのなら、struct
を使った普通のメタ関数は普通にコンパイルできるのだろう。そう思ってconstexpr
関数を使っているところを無くした。リファクタリングも兼ねてメタ関数を整理もした。とりあえずTravis.CIとappvayorのテストは通った。
そして、予想があっているかどうかを確認するため、VMを立てた。
本題: Manjaro on VirtualBox
Arch系で簡単に使うとなると、Archそのものは厳しいので、Manjaroだろう。使ったことはないが記事で見たことがある。そしてIssueの報告者もManjaro使いだったのでこれ以外の選択肢はないだろう。
というわけでVMを立ち上げてManjaroをインストールした。gccのバージョンを確認する。
[manjaro@manjaro ~]$ g++ --version g++ (GCC) 7.3.1 20180312
よし、ということで件のプロダクトをcloneしてcmake
……と思ったが、cmake
がない。確かArchのパッケージマネージャはpacman
とか言ったな、と思いググってインストールしようとしてみる。
[manjaro@manjaro ~]$ pacman -S cmake
と思ったが何やらエラーが出ている。「database file for "core" does not exist
」というようなエラーだ。
よくわからなかったまま十分ほどgoogleし、どうやらManjaroのインストール後は、最初にpacmanのデータベースファイルを更新しなければならないらしいとわかった。
$ pacman -Syy
を実行すると、どうやらどこかのサーバからパッケージのリストのようなものがダウンロードされている感じがして、インストールできるようになった。
こういうので時間を食ってしまうのは仕方がないが少しつらい。
結果
で、Issueはどうなったのかというと、直っていた。workaround成功だ。というわけでArch使いの方も安心して我がプロダクトを使っていただきたい。