[PATCH] Implement DR85: Redeclaration of member class

Richard Smith richard at metafoo.co.uk
Mon Jun 10 18:44:48 PDT 2013


LGTM, thanks!

On Mon, Jun 10, 2013 at 4:15 PM, David Majnemer
<david.majnemer at gmail.com> wrote:
> On Mon, Jun 10, 2013 at 3:44 PM, Richard Smith <richard at metafoo.co.uk>
> wrote:
>>
>> It'd be useful to keep one testcase of this within a class template.
>> Also, please keep the diagnostic as an ExtWarn.
>
>
> Done and done.
>
>>
>>
>> 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