以下のコードをgccでコンパイルしてみて欲しい。
struct Base { void f() { } } ; struct D1 : Base { } ; struct D2 : Base { } ; struct Derived : D1, D2 { void f() { Base::f() ; } } ;
weekly buildでは、結果は、「internal compiler error: in build_base_path, at cp/class.c:270」となる。バグ報告するべきなんだろうか。
ちなみに、MSVCでは、問題なくコンパイルが通ってしまう。これも問題だ。興味深いことに、MSVCは、派生の順番がアクセスチェックに影響するらしい
struct Base { void f() { } } ; struct D1 : private Base { } ; struct D2 : Base { } ; struct Derived1 : D1, D2 { void f() { Base::f() ; // エラー、Base::fはprivate } } ; struct Derived2 : D2, D1 // 順番を変えただけ { void f() { Base::f() ; // エラーなし。そんなバカな } } ;
素直に実装すれば、name lookupの時点でエラーになるはずなのだが、それを通り越して、アクセスチェックでのエラーになっている。しかも、アクセスチェックが派生の順番に影響されるという不思議な仕様。MSVCは本当にクソだ。
同じエラーメッセージの報告がすでにありました。
ReplyDeletehttp://gcc.gnu.org/bugzilla/show_bug.cgi?id=44017
(via http://www.google.co.jp/search?q=%22internal+compiler+error%3A+in+build_base_path%2C+at+cp%2Fclass.c%3A270%22 )
trunk では修正されているようです。別のリリースバージョンで発生しているの
なら報告しておいてもらったほうがいいと思います。
そうか。ぐぐれば良かったのか。
ReplyDeleteGCCのBugzillaの検索機能は全く使いものにならないのでどうしようか迷っていたのです。
ICE(Internal Compiler Error)についてはice_on_invalid_codeといったカテゴライズがあり、基本的にICEはバグレポに投げると良いです。well-formed/ill-formedやundefined/unspecifiedに関わらず。
ReplyDelete