rjmccall added inline comments.

================
Comment at: clang/lib/Sema/SemaDecl.cpp:6904
             << Name << RD->getTagKind();
           Invalid = true;
+        } else if (RD->isLocalClass()) {
----------------
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;
    };
  }();
}
```


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