hintonda marked an inline comment as done.
hintonda added inline comments.

================
Comment at: 
clang-tools-extra/clang-tidy/llvm/AvoidCastInConditionalCheck.cpp:145
+
+    diag(MatchedDecl->getBeginLoc(), "use dyn_cast_or_null")
+        << FixItHint::CreateReplacement(SourceRange(MatchedDecl->getBeginLoc(),
----------------
hintonda wrote:
> aaron.ballman wrote:
> > hintonda wrote:
> > > aaron.ballman wrote:
> > > > hintonda wrote:
> > > > > aaron.ballman wrote:
> > > > > > This diagnostic doesn't tell the user what they've done wrong with 
> > > > > > the code or why this is a better choice.
> > > > > Yes, but I'm not yet sure what it should say.  Was sorta hoping for a 
> > > > > suggestion.  
> > > > Do you have any evidence that this situation happens in practice? I 
> > > > kind of feel like this entire branch could be eliminated from this 
> > > > patch unless it actually catches problems that happen.
> > > Yes, here are a few from clang/lib -- let me know if you think it's worth 
> > > it or not to keep this:
> > > 
> > > - DiagnosticName: llvm-avoid-cast-in-conditional
> > >   FileOffset: 305293
> > >   FilePath: 
> > > /Users/dhinton/projects/llvm_project/monorepo/llvm-project/clang/lib/Sema/SemaTemplate.cpp
> > >   Message: method 'getAsTemplateDecl' is called twice and could be 
> > > expensive
> > >   Replacements:
> > >   - FilePath: 
> > > /Users/dhinton/projects/llvm_project/monorepo/llvm-project/clang/lib/Sema/SemaTemplate.cpp
> > >     Length: 93
> > >     Offset: 305293
> > >     ReplacementText: 
> > > dyn_cast_or_null<TemplateTemplateParmDecl>(Name.getAsTemplateDecl())
> > > - DiagnosticName: llvm-avoid-cast-in-conditional
> > >   FileOffset: 153442
> > >   FilePath: 
> > > /Users/dhinton/projects/llvm_project/monorepo/llvm-project/clang/lib/AST/ASTContext.cpp
> > >   Message: method 'getAsTemplateDecl' is called twice and could be 
> > > expensive
> > >   Replacements:
> > >   - FilePath: 
> > > /Users/dhinton/projects/llvm_project/monorepo/llvm-project/clang/lib/AST/ASTContext.cpp
> > >     Length: 92
> > >     Offset: 153442
> > >     ReplacementText: 
> > > dyn_cast_or_null<TypeAliasTemplateDecl>(Template.getAsTemplateDecl())
> > > - DiagnosticName: llvm-avoid-cast-in-conditional
> > >   FileOffset: 97556
> > >   FilePath: 
> > > /Users/dhinton/projects/llvm_project/monorepo/llvm-project/clang/lib/AST/Expr.cpp
> > >   Message: method 'getMethodDecl' is called twice and could be expensive
> > >   Replacements:
> > >   - FilePath: 
> > > /Users/dhinton/projects/llvm_project/monorepo/llvm-project/clang/lib/AST/Expr.cpp
> > >     Length: 68
> > >     Offset: 97556
> > >     ReplacementText: 
> > > dyn_cast_or_null<CXXConversionDecl>(MCE->getMethodDecl())
> > > - DiagnosticName: llvm-avoid-cast-in-conditional
> > >   FileOffset: 301950
> > >   FilePath: 
> > > /Users/dhinton/projects/llvm_project/monorepo/llvm-project/clang/lib/Sema/SemaInit.cpp
> > >   Message: method 'get' is called twice and could be expensive
> > >   Replacements:
> > >   - FilePath: 
> > > /Users/dhinton/projects/llvm_project/monorepo/llvm-project/clang/lib/Sema/SemaInit.cpp
> > >     Length: 49
> > >     Offset: 301950
> > >     ReplacementText: dyn_cast_or_null<InitListExpr>(CurInit.get())
> > > - DiagnosticName: llvm-avoid-cast-in-conditional
> > >   FileOffset: 14335
> > >   FilePath: 
> > > /Users/dhinton/projects/llvm_project/monorepo/llvm-project/clang/lib/Sema/AnalysisBasedWarnings.cpp
> > >   Message: method 'operator bool' is called twice and could be expensive
> > >   Replacements:
> > >   - FilePath: 
> > > /Users/dhinton/projects/llvm_project/monorepo/llvm-project/clang/lib/Sema/AnalysisBasedWarnings.cpp
> > >     Length: 57
> > >     Offset: 14335
> > >     ReplacementText: dyn_cast_or_null<CXXTryStmt>(B->getTerminator())
> > > - DiagnosticName: llvm-avoid-cast-in-conditional
> > >   FileOffset: 15997
> > >   FilePath: 
> > > /Users/dhinton/projects/llvm_project/monorepo/llvm-project/clang/lib/Sema/AnalysisBasedWarnings.cpp
> > >   Message: method 'operator bool' is called twice and could be expensive
> > >   Replacements:
> > >   - FilePath: 
> > > /Users/dhinton/projects/llvm_project/monorepo/llvm-project/clang/lib/Sema/AnalysisBasedWarnings.cpp
> > >     Length: 55
> > >     Offset: 15997
> > >     ReplacementText: dyn_cast_or_null<CXXTryStmt>(B.getTerminator())
> > > - DiagnosticName: llvm-avoid-cast-in-conditional
> > >   FileOffset: 9492
> > >   FilePath: 
> > > /Users/dhinton/projects/llvm_project/monorepo/llvm-project/clang/include/clang/Analysis/Analyses/ThreadSafetyCommon.h
> > >   Message: method 'sexpr' is called twice and could be expensive
> > >   Replacements:
> > >   - FilePath: 
> > > /Users/dhinton/projects/llvm_project/monorepo/llvm-project/clang/include/clang/Analysis/Analyses/ThreadSafetyCommon.h
> > >     Length: 39
> > >     Offset: 9492
> > >     ReplacementText: dyn_cast_or_null<til::Undefined>(sexpr())
> > > - DiagnosticName: llvm-avoid-cast-in-conditional
> > >   FileOffset: 9572
> > >   FilePath: 
> > > /Users/dhinton/projects/llvm_project/monorepo/llvm-project/clang/include/clang/Analysis/Analyses/ThreadSafetyCommon.h
> > >   Message: method 'sexpr' is called twice and could be expensive
> > >   Replacements:
> > >   - FilePath: 
> > > /Users/dhinton/projects/llvm_project/monorepo/llvm-project/clang/include/clang/Analysis/Analyses/ThreadSafetyCommon.h
> > >     Length: 38
> > >     Offset: 9572
> > >     ReplacementText: dyn_cast_or_null<til::Wildcard>(sexpr())
> > > - DiagnosticName: llvm-avoid-cast-in-conditional
> > >   FileOffset: 9492
> > >   FilePath: 
> > > /Users/dhinton/projects/llvm_project/monorepo/llvm-project/clang/include/clang/Analysis/Analyses/ThreadSafetyCommon.h
> > >   Message: method 'sexpr' is called twice and could be expensive
> > >   Replacements:
> > >   - FilePath: 
> > > /Users/dhinton/projects/llvm_project/monorepo/llvm-project/clang/include/clang/Analysis/Analyses/ThreadSafetyCommon.h
> > >     Length: 39
> > >     Offset: 9492
> > >     ReplacementText: dyn_cast_or_null<til::Undefined>(sexpr())
> > > - DiagnosticName: llvm-avoid-cast-in-conditional
> > >   FileOffset: 9572
> > >   FilePath: 
> > > /Users/dhinton/projects/llvm_project/monorepo/llvm-project/clang/include/clang/Analysis/Analyses/ThreadSafetyCommon.h
> > >   Message: method 'sexpr' is called twice and could be expensive
> > >   Replacements:
> > >   - FilePath: 
> > > /Users/dhinton/projects/llvm_project/monorepo/llvm-project/clang/include/clang/Analysis/Analyses/ThreadSafetyCommon.h
> > >     Length: 38
> > >     Offset: 9572
> > >     ReplacementText: dyn_cast_or_null<til::Wildcard>(sexpr())
> > > 
> > `/Users/dhinton/projects/llvm_project/monorepo/llvm-project/clang/lib/Sema/SemaTemplate.cpp
> >  Message: method 'getAsTemplateDecl' is called twice and could be expensive 
> > Replacements:`
> > 
> > This one is a false positive and the fix is incorrect. The original code is:
> > ```
> >     Diag(TemplateNameLoc, diag::err_not_class_template_specialization)
> >       << (Name.getAsTemplateDecl() &&
> >           isa<TemplateTemplateParmDecl>(Name.getAsTemplateDecl()));
> > ```
> > The rest look to be plausible true positives, but not a single case looks 
> > like there is much expense involved in the expression, and honestly, 
> > several of the replacement expressions would feel a bit "worse" to me, 
> > despite being equivalent. For instance, code like: `bool Foo = bar && 
> > isa<T>(bar);` reads more clearly to me than `bool Foo = 
> > dyn_cast_or_null<T>(bar);` because the former looks like a bool initializer 
> > while the latter looks like the user meant to write `T *Foo` instead of 
> > `bool Foo`.
> > 
> > I think this part of the check is contentious and I'd rather leave it out 
> > for now so that we can get the rest of the check in. I'd be especially 
> > curious to know whether the community would prefer to see us leave this 
> > situation alone, introduce `isa_or_null<T>()`, or use 
> > `dyn_cast_or_null<T>()`.
> How is that a false positive?  In
> 
> ```
> Diag(TemplateNameLoc, diag::err_not_class_template_specialization)
>   << (Name.getAsTemplateDecl() &&
>       isa<TemplateTemplateParmDecl>(Name.getAsTemplateDecl()));
> ```
> 
> `Name.getAsTemplateDecl()` is called twice.  First to see if returned 
> `nullptr` or not, then to see if the pointer satisfied 
> `isa<TemplateTemplateParmDecl>(Name.getAsTemplateDecl())`.
> 
> As for whether or not it's worth having, I'll defer to you.  Most cases are 
> relatively cheap, but it can be expensive.  I'll go back and rerun it on all 
> of clang+llvm and find the expensive ones if you're interested, but it takes 
> a really long time to run on my laptop, so let me know what you'd prefer.
> 
Btw, I'll draft a message to the list and ask about `isa_or_null`, et al, in 
the morning.  I didn't want to add stuff like that in this patch, but would be 
happy to use it if I got the green light to add it in another.

Thanks again for the feedback -- especially on the matchers.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D59802



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

Reply via email to