3.4.0 vs 3.3.3

Shelly Adhikari shelly@interrasystems.com
Wed Apr 21 00:45:00 GMT 2004


Giovanni Bajo wrote:

>Shelly Adhikari wrote:
>
>  
>
>>Should I file a bug against gcc 3.4.0, the following compiles fine
>>with gcc 3.3.3 but gives errors with gcc 3.4.0.
>>
>>-----------------------------------------------------------------------------
>>    
>>
>----------------------------------------------
>  
>
>>template <class A> class C;
>>
>>template <class A> class B {
>>public:
>>    B() { }
>>    ~B() { }
>>protected:
>>    int abc;
>>    void g() {}
>>    friend void C<A>::f(B<A>* p);
>>};
>>
>>template <class A> class C : public B<A> {
>>public:
>>    void f(B<A>* p) {
>>        p->g();
>>        int m = p->abc;
>>    }
>>};
>>
>>int main() {
>>    B<int>*    y = new B<int>();
>>    C<int>    x;
>>    x.f(y);
>>}
>>-----------------------------------------------------------------------------
>>    
>>
>----------------------------------------------
>
>The code is ill-formed: the instantiation of B<int> triggers an instantiation
>of C<int> in the friend declaration, which in turns triggers another
>instantiation of B<int> (as base member). The recursion is detected and
>compilation is stopped (in fact, while instatiating C<int>, B<int> is still
>incomplete).
>
>This probably happens due to some patches to handle the friend declarations
>better.
>
>Giovanni Bajo
>
Hello,

By - 'the code is ill formed' - do you mean it is not allowed by the C++ 
standard?

Thanks for your help.

Shelly



More information about the Gcc mailing list