Caslyn added a comment.

Hi Piotr - I'm sorry for the delay in getting back to you. Thank you again for 
your review comments. I did my best trying to get the right combination of 
matchers that limit the candidates and allow the exceptions that we want. I 
wasn't successful in figuring out a way to exempt static references to 
non-trivial destructor classes that don't have the lifetime extension (see 
comment).



================
Comment at: clang-tools-extra/clang-tidy/fuchsia/GlobalVariablesCheck.cpp:35
+  Finder->addMatcher(
+      varDecl(is_global_or_static_candidate,
+              unless(hasType(cxxRecordDecl(hasAnyName(IgnoreVars)))))
----------------
PiotrZSL wrote:
> only classes can be non trivial to destroy, so we should exclude on this 
> level all types that are not CXXRecordDecl.
In the latest revision I narrowed the matching candidates to: 

```
 anyOf(hasType(hasCanonicalType(references(qualType()))),
                hasType(arrayType()),
                hasType(cxxRecordDecl(hasNonTrivialDestructor()))),
```

I found I needed to capture arrays and references in the tests and included 
those in the limited candidates.

However, after a lot of testing and experimenting with 
`materializeTemporaryExpr` and your suggestions, I still couldn't figure out a 
way to allow references without lifetime extensions. For ex, this test gives a 
false positive with the latest patch:

```
  // Static references with function scope are allowed if they don't have
  // lifetime-extension.
  static const NonTriviallyDestructibleClass &ConstRefFuncNtdc = *new 
NonTriviallyDestructibleClass;
```

I've been starting to question if this is a general enough use case to include 
as an exception. Do you think it would be a mistake if this check does not 
allow static references to non-trivial destructors, regardless of a lifetime 
extension?  


================
Comment at: clang-tools-extra/clang-tidy/fuchsia/GlobalVariablesCheck.cpp:36
+      varDecl(is_global_or_static_candidate,
+              unless(hasType(cxxRecordDecl(hasAnyName(IgnoreVars)))))
+          .bind("global_var"),
----------------
PiotrZSL wrote:
> PiotrZSL wrote:
> > could be better, like in other checks.
> 
I went ahead and combined the two suggestions around the `IgnoreVars` matching .


================
Comment at: 
clang-tools-extra/test/clang-tidy/checkers/fuchsia/global-variables.cpp:103
+ntdc_ref typedef_ref_ntdc =
+    *new NonTriviallyDestructibleClass;
+
----------------
PiotrZSL wrote:
> that will act just like alias
> ``NonTriviallyDestructibleClass XYZ;
> typedef_ref_ntdc  = XYZ;``
> this ``new`` here is confusing... both examples should be made simpler.
I got rid of these scenarios and tested typedef to a reference per your 
suggestion in the latest patch - hopefully I captured it correctly:

> typedef for const reference of non trivial type that is used to exend 
> lfietime of variable (calling function that returns object with non trivial 
> destructor).


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D152953

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

Reply via email to