2011-05-04

笑えるgcc

詳しい人に丸投げシリーズ - 名古屋313の日記

以下のコードをコンパイルするとエラーになる。

class X
{
    int value ;
    friend class Y ;
} ;

class Y
{
public :
    template < typename T >
    static auto f(T t) -> decltype( t.value )
    {
        return t.value ;
    }
} ;
 
int main()
{
    X x ;
    Y::f(x) ;
}

gccは、おそらくバグのため、このコードをコンパイルできない。興味深いのは、エラーメッセージだ。

In function 'int main()':
error: 'int X::value' is private
error: within this context

そもそもmain関数内というのが間違っている。。X::valueにアクセスしているのは、Y::get関数である。

試しに、クラスXからmain関数をfriendにしてみると。

class X
{
    int value ;
    friend class Y ;
    friend int main() ;
} ;

なぜかコンパイルが通ってしまう。明らかにおかしい。

なかなか笑えるバグだ。発見者はバグレポートを投げたほうがいいと思う。

No comments: