[PATCH] Implement DR85: Redeclaration of member class

Richard Smith richard at metafoo.co.uk
Mon Jun 10 15:44:05 PDT 2013


It'd be useful to keep one testcase of this within a class template.
Also, please keep the diagnostic as an ExtWarn.

On Mon, Jun 10, 2013 at 3:21 PM, David Majnemer
<david.majnemer at gmail.com> wrote:
> On Mon, Jun 10, 2013 at 12:56 PM, Richard Smith <richard at metafoo.co.uk>
> wrote:
>>
>> On Mon, Jun 10, 2013 at 11:41 AM, David Majnemer
>> <david.majnemer at gmail.com> wrote:
>> > On Mon, Jun 10, 2013 at 9:14 AM, Jordan Rose <jordan_rose at apple.com>
>> > wrote:
>> >>
>> >> The text says "already-defined", but in the first case it's merely
>> >> declared twice.
>> >
>> >
>> > Fixed.
>> >
>> >>
>> >>
>> >> If there's really no better justification than "because the standard
>> >> says
>> >> so", why not make this Ext or ExtWarn instead of Error? Clearly we
>> >> already
>> >> have this working.
>> >
>> >
>> > I made it ExtWarn and gave it the flag -Wmember-class-redeclared.
>>
>> In C++11, the relevant text is: "A member shall not be declared
>> twice in the member-specification, except that a nested class or
>> member class template can be declared and
>> then later defined, and except that an enumeration can be introduced
>> with an opaque-enum-declaration and
>> later redeclared with an enum-specifier."
>>
>>
>> Please add tests for the union and enum cases too, and make sure the
>> patch correctly handles them.
>>
>> struct A {
>>   union U;
>>   union U {}; // ok
>>   union U; // error
>>
>>   enum E1 : int;
>>   enum E1 : int { e1 }; // ok
>>   enum E1 : int; // error
>>
>>   enum class E2;
>>   enum class E2 { e2 }; // ok
>>   enum class E2; // error
>> };
>
>
> Done.
>
>>
>>
>> >> Jordan
>> >>
>> >>
>> >> On Jun 9, 2013, at 23:51 , David Majnemer <david.majnemer at gmail.com>
>> >> wrote:
>> >>
>> >> The attached patch implements DR85 [*] which disallows the existence of
>> >> a
>> >> declaration of a member class that isn't a forward declaration before
>> >> it's
>> >> definition.
>> >>
>> >> This means that the following would be disallowed:
>> >> class A {
>> >>   struct B; // note here
>> >>   struct B; // error here
>> >> };
>> >>
>> >> as well as:
>> >> class C {
>> >>   struct B {}; // note here
>> >>   struct B; // error here
>> >> };
>> >>
>> >> I'm very open to suggestions on the diagnostic, I couldn't think of a
>> >> great one that doesn't boil down to "this is forbidden because the
>> >> standard
>> >> says so."
>> >>
>> >> [*] http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#85
>> >>
>> >> Thanks
>> >> --
>> >> David Majnemer
>> >>
>> >>
>> >> _______________________________________________
>> >> cfe-commits mailing list
>> >> cfe-commits at cs.uiuc.edu
>> >> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>> >>
>> >>
>> >>
>> >
>> >
>> > _______________________________________________
>> > cfe-commits mailing list
>> > cfe-commits at cs.uiuc.edu
>> > http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>> >
>
>



More information about the cfe-commits mailing list