xgupta marked 3 inline comments as done.
xgupta added inline comments.

================
Comment at: 
clang-tools-extra/clang-tidy/bugprone/SwitchMissingDefaultCaseCheck.cpp:16-29
+void SwitchMissingDefaultCaseCheck::registerMatchers(
+    ast_matchers::MatchFinder *Finder) {
+  Finder->addMatcher(
+      switchStmt(has(implicitCastExpr().bind("cast")),
+                 unless(hasAncestor(switchStmt(has(defaultStmt())))))
+          .bind("switch"),
+      this);
----------------
PiotrZSL wrote:
> I do not like that implicitCastExpr.
> 
> this is AST for your example:
> ```
>    `-SwitchStmt <line:4:3, line:7:3>
>       |-ImplicitCastExpr <line:4:11> 'int' <LValueToRValue>
>       | `-DeclRefExpr <col:11> 'int' lvalue Var 0x555de93bc200 'i' 'int'
>       `-CompoundStmt <col:14, line:7:3>
>         `-CaseStmt <line:5:3, line:6:5>
>           |-ConstantExpr <line:5:8> 'int'
>           | |-value: Int 0
>           | `-IntegerLiteral <col:8> 'int' 0
>           `-BreakStmt <line:6:5>
> ```
> 
> look that case there is only because we got cast from rvalue to lvalue.
> if you write example like this:
> 
> ```
> int getValue();
> 
> void Positive() {
>   switch (getValue()) {
>   case 0:
>     break;
>   }
> }
> 
> ```
> 
> there is not cast because AST will look like this:
> ```
> -SwitchStmt <line:4:3, line:7:3>
>       |-CallExpr <line:4:11, col:20> 'int'
>       | `-ImplicitCastExpr <col:11> 'int (*)()' <FunctionToPointerDecay>
>       |   `-DeclRefExpr <col:11> 'int ()' lvalue Function 0x5573a3b38100 
> 'getValue' 'int ()'
>       `-CompoundStmt <col:23, line:7:3>
>         `-CaseStmt <line:5:3, line:6:5>
>           |-ConstantExpr <line:5:8> 'int'
>           | |-value: Int 0
>           | `-IntegerLiteral <col:8> 'int' 0
>           `-BreakStmt <line:6:5>
> ```
> 
> So add test with rvalue int... remove that implicit cast checks, and use 
> IgnoreUnlessSpelledInSource (it will remove IntegralCast cast from enum to 
> int, so hasCondition would match enum directly)
Removed the implicit cast but couldn't get how to use 
IgnoreUnlessSpelledInSource here.


================
Comment at: 
clang-tools-extra/clang-tidy/bugprone/SwitchMissingDefaultCaseCheck.cpp:19
+  Finder->addMatcher(
+      switchStmt(has(implicitCastExpr().bind("cast")),
+                 unless(hasAncestor(switchStmt(has(defaultStmt())))))
----------------
PiotrZSL wrote:
> this should be something like:
> ```hasCondition(expr(hasType(qualType(hasCanonicalType(unless(hasDeclaration(enumDecl()))))))```
> Or you can verify just if type is integral type.
> Note that with modern C++ you may have init statements in enums.
> 
For some reason, the check is giving warning for enum cases and I couldn't 
understand why, can you please help?


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D4784

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

Reply via email to