john.brawn marked an inline comment as done.
john.brawn added inline comments.


================
Comment at: clang/lib/Sema/SemaDecl.cpp:6904
             << Name << RD->getTagKind();
           Invalid = true;
+        } else if (RD->isLocalClass()) {
----------------
rjmccall wrote:
> john.brawn wrote:
> > rjmccall wrote:
> > > This diagnostic actually ignores the tag kind that passed down to it, 
> > > which should be fixed.  Also, you should pass in the tag kind for the 
> > > actual anonymous class you found.
> > > 
> > > While I'm looking at this code: `isLocalClass` is mis-designed and 
> > > doesn't work for any of our non-`FunctionDecl` local contexts.  This 
> > > check should be `if (RD->getParentFunctionOrMethod())`.
> > > This diagnostic actually ignores the tag kind that passed down to it, 
> > > which should be fixed. Also, you should pass in the tag kind for the 
> > > actual anonymous class you found.
> > 
> > Will do.
> > 
> > > While I'm looking at this code: isLocalClass is mis-designed and doesn't 
> > > work for any of our non-FunctionDecl local contexts. This check should be 
> > > if (RD->getParentFunctionOrMethod()).
> > 
> > CXXMethodDecl has FunctionDecl as a parent class, so isLocalClass will find 
> > and return a CXXMethodDecl. Checking it on
> > 
> > ```
> > class Example {
> >   void method() {
> >     class X {
> >       static int x;
> >     };
> >   }
> > };
> > ```
> > I get the error as expected. Do you have an example where it doesn't work?
> > Will do.
> 
> You need to also update the diagnostic to actually care about this.
> 
> >  Do you have an example where it doesn't work?
> 
> All of the standard C/C++ local contexts are FunctionDecls, but "blocks", 
> ObjC methods, and OpenMP captured statements aren't.  The simplest example 
> would be (under `-fblocks`):
> 
> ```
> void test() {
>   ^{
>     class X {
>       static int x;
>     };
>   }();
> }
> ```
> You need to also update the diagnostic to actually care about this.

It looks like it already does? E.g. in the tests added to anonymous-struct.cpp 
where the error is "anonymous struct" or "anonymous class" depending on if it's 
an anonymous class or struct.


CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D80295/new/

https://reviews.llvm.org/D80295



_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to