gribozavr added inline comments.

================
Comment at: clang/lib/Sema/SemaAttr.cpp:200
     CXXRecordDecl *Canonical = Record->getCanonicalDecl();
     if (Canonical->hasAttr<OwnerAttr>() || Canonical->hasAttr<PointerAttr>())
       return;
----------------
mgehre wrote:
> gribozavr wrote:
> > mgehre wrote:
> > > gribozavr wrote:
> > > > Should this code not do this short-circuit check? It is prone to going 
> > > > out of sync with the code in 
> > > > `addGslOwnerPointerAttributeIfNotExisting`, like it did just now.
> > > > 
> > > > If you want to check for attribute before doing the string search, you 
> > > > could pass the string set into 
> > > > `addGslOwnerPointerAttributeIfNotExisting`, and let that decide if it 
> > > > should infer the attribute or not.
> > > Yes, the `hasAttr` check here is an optimization to avoid the string 
> > > search. I don't think I can move the string search into 
> > > `addGslOwnerPointerAttributeIfNotExisting`, because that function is 
> > > called 
> > > from other call sites that don't care about a set of names.
> > Sorry I wasn't clear enough -- the issue that I noticed is that this check 
> > looks at the canonical decl, while 
> > `addGslOwnerPointerAttributeIfNotExisting` attaches the attribute to the 
> > decl itself -- that's what I meant by "out of sync".
> I make sure that `addGslOwnerPointerAttributeIfNotExisting` is only called 
> with the canonical decl as argument, which the caller usually has around. The 
> only exception to this is when addGslOwnerPointerAttributeIfNotExisting calls 
> itself to attach an attribute to the definition of templated class.
I see. This is a tricky contract, and ".getCanonicalDecl()" at callsites feel 
somewhat random. I think it should be at least documented. However...

> I now start to wonder if we should instead put the attribute on all 
> declarations (instead of just the canonical). Later redeclarations 
> automatically inherit the attributes.
> This would make both the checking easier (just check any declaration, no need 
> to obtain the canonical first), and remove the special
> case for adding to the definition of templated record for ClassTemplateDecls.

I'd support that.


================
Comment at: clang/test/SemaCXX/attr-gsl-owner-pointer-std.cpp:95
 
+// The iterator typedef is a DependentNameType.
+template <typename T>
----------------
mgehre wrote:
> gribozavr wrote:
> > This test file is getting pretty long and subtle, with lots of things are 
> > being mixed into one file without isolation.
> > 
> > WDYT about refactoring it into a unit test that uses AST matchers to verify 
> > attribute presence?
> > 
> > See clang/unittests/ASTMatchers/ASTMatchersNodeTest.cpp for examples.
> > 
> > Each test case would look approximately like this:
> > 
> > ```
> > EXPECT_TRUE(matches(
> >   "template class ...",
> >   classTemplateDecl(hasName("foo"), hasAttr(clang::attr::GslPointer)));
> > ```
> > 
> > Each test case would be isolated from other tests, each test would have a 
> > name (and optionally a comment) that will make it obvious what exactly is 
> > being tested.
> > 
> > It would be also possible to verify things like "The iterator typedef is a 
> > DependentNameType" to ensure that we're testing exactly what we want to 
> > test.
> I like the AST matcher approach! This test file is really hard to debug - I 
> usually copy a test to its own file for debugging. 
> Would you be okay with deferring the testing change to the next PR?
Of course! Thanks!


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D66179



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

Reply via email to