Jiri Palecek <jpale...@web.de> a écrit:

> Ulf Magnusson wrote:
>> On Wed, Nov 14, 2012 at 6:10 PM, Piotr Wyderski
>> <piotr.wyder...@gmail.com>  wrote:
>>> The following snippet:
>>>
>>> class A {};
>>> class B : public A {
>>>
>>>     typedef A super;
>>>
>>> public:
>>>
>>>     class X {};
>>> };
>>>
>>>
>>> class C : public B {
>>>
>>>     typedef B super;
>>>
>>>     class X : public super::X {
>>>
>>>        typedef super::X super;
>>>     };
>>> };
>>>
>>> compiles without a warning on Comeau and MSVC, but GCC (4.6.1 and
>>> 4.7.1) failes with the following message:
>>>
>>> $ gcc -c bug.cpp
>>> bug.cpp:18:24: error: declaration of ‘typedef class B::X C::X::super’
>>> [-fpermissive]
>>> bug.cpp:14:14: error: changes meaning of ‘super’ from ‘typedef class B
>>> C::super’ [-fpermissive]
>>>
>>> Should I file a report?
>>>
>>>      Best regards, Piotr
>> Here's a two-line TC:
>>
>> typedef struct { typedef int type; } s1;
>> struct S2 { s1::type s1; };
>>
>> Fails with GCC 4.6.3; succeeds with clang 3.0. Looks like a bug to me.
>>
>> /Ulf
>>
> In your example, GCC is in fact right. Basically, you mustn't have a name 
> refer to two things in a class:
>
> 3.3.6/1: ... A name N used in a class S shall refer to the same declaration 
> in its context and when re-evaluated in the
> completed scope of S. No diagnostic is required for a violation of
> this rule. ...

That, and [dcl.typedef]/6 says:

    In a given scope, a typedef specifier shall not be used to redefine
    the name of any type declared in that scope to refer to a different
    type.

So, I tend to think that GCC is right here.

-- 
                Dodji

Reply via email to