[cfe-commits] MS anonymous struct patch

Richard Smith richard at metafoo.co.uk
Sat Feb 18 22:46:40 PST 2012


On Sat, Feb 18, 2012 at 9:37 PM, Jianjiang Ceng <
jianjiang.ceng at googlemail.com> wrote:

> On Fri, Feb 17, 2012 at 11:56AM,"David Blaikie" <dblaikie at gmail.com>Wrote:
> >
> > On Fri, Feb 17, 2012 at 6:55 AM, Jianjiang Ceng
> > <jianjiang.ceng at googlemail.com> wrote:
> > > Hi all,
> > >
> > > please find the attached patch which should fix the problem of parsing
> > > tagged anonymous structs, when ms-extensions is enabled.
> > >
> > > The following code can be parsed by the MS C compiler and GCC, but
> > > clang gave an error on couldn't resolve the anonymous struct member
> > > "c".
> > >
> > > struct a {
> > >  struct b{
> > >   int c;
> > >  };
> > > };
> >
> > I'm not sure I understand where the anonymity is here - is there a
> > mistake in your example?
>
> By default, GCC does not allow an anonymous struct to have a tag, i.e.
> "b" in the example. If "-fms-extensions" is not enabled, GCC will
> report that nothing is declared by the struct "b".
>
> Things are a little bit different when MS extensions are allowed,
> anonymous structs can have tags. Since they, as member in other
> structs, still lack a name, they are anonymous. Therefore, the struct
> member "c" in the example should not be referenced by struct_a.b.c,
> but struct_a.c.


I believe this extension should be enabled by MicrosoftMode rather than
MicrosoftExt, since it alters the behavior of valid C code. However, I note
that gcc's -fms-extensions enables it.

Clang code has a line length limit of 80 columns; your patch has some lines
longer than 80 that. Also, your testcase has a mixture of tabs and spaces.

Index: lib/Sema/SemaDecl.cpp
@@ -2954,7 +2955,7 @@
   SmallVector<NamedDecl*, 2> Chain;
   Chain.push_back(Anon);

-  RecordDecl *RecordDef = Record->getDefinition();
+  RecordDecl *RecordDef = Record->isCompleteDefinition() ? Record :
Record->getDefinition();
   if (!RecordDef || InjectAnonymousStructOrUnionMembers(*this, S,
CurContext,
                                                         RecordDef, AS_none,
                                                         Chain, true))

This change appears to be unnecessary.

- Richard
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20120218/6f62efbd/attachment.html>


More information about the cfe-commits mailing list