On Wed, Apr 4, 2018 at 12:25 PM, Alexandre Oliva <aol...@redhat.com> wrote:
> On Apr  4, 2018, Jason Merrill <ja...@redhat.com> wrote:
>
>> On Tue, Apr 3, 2018 at 11:25 PM, Alexandre Oliva <aol...@redhat.com> wrote:
>>> I still think we could attempt to retain the extension as it is, parsing
>>> types introduced in data member initializers within the scope of the
>>> class containing the data member, like we do, but, when the class is
>>> already complete, recording it if not in TYPE_FIELDS, in some additional
>>> field consulted for name mangling purposes and, in order to retain
>>> compatibility, if the type is not a closure or anonymous, also recording
>>> it in the enclosing namespace, so that it is found by lookup as in the
>>> quoted snippet.
>>>
>>> Is that a terrible idea?
>
>> It sounds like a lot of work to support a very questionable pattern.
>
> It's not so much work (the simple patch below does just that, and its
> testing is almost done); I agree it's questionable, and it's limited (it
> never worked in initializers of members of template classes, as the -4
> testcase, so we don't have to worry about retaining temporary
> compatibility with that), but it's there, so I think we'd be better off
> deprecating it, if that's the direction we want to go.  The patch below
> has just the right spot for a deprecation warning, even ;-)
>
> We could recommend users to use a closure that returns the offsetof
> instead of the unadorned offsetof.  That would work portably, but we
> shouldn't make the transformation ourselves: it would change the
> ABI-defined numbering of closure types.
>
>> Perhaps we should just disallow defining a type in offsetof if the
>> current scope is a class.
>
> Even anonymous types?  I suspect this could break a lot of existing
> code, with anonymous types hiding in macros.

It seems unlikely to me that such a use of macros would occur at class
scope; there's no C compatibility issue there.

Jason

Reply via email to