[PATCH] D141058: [clang-tidy] fix wrong fixup for bugprone-implicit-widening-of-multiplication-result

Vincent Hong via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Sat Jan 7 07:00:40 PST 2023


v1nh1shungry added a comment.

Thank you for reviewing and giving suggestions! @Febbe

Please take a look at my reply. Sorry if I misunderstood anything!



================
Comment at: clang-tools-extra/clang-tidy/bugprone/ImplicitWideningOfMultiplicationResultCheck.cpp:215
                   (Twine("static_cast<") + TyAsString + ">(").str())
-           << FixItHint::CreateInsertion(IndexExpr->getEndLoc(), ")");
     else
----------------
Febbe wrote:
> Actually, I find it pretty weird/suspicious, that `<AnyBinaryExr*> -> getEndLoc()` does not return the end of its `Expr`. The code looked correct already.
> Can you elaborate, if this is a bug in the `getEndLoc()` of those `Expr`s? It might be better to fix it there directly.
> 
I'm really not an expert on `SourceLocation`. I just took a rough look at these `getEndLoc()`s.

Take `1 + 2` as an example, this is a `BinaryOperator` with two `IntegerLiteral`s. When we call `Expr::getEndLoc()` which is actually `Stmt::getEndLoc()` on it, it will call `BinaryOperator::getEndLoc()` and this actually returns the `RHS->getEndLoc()`, that is  the result of `IntegerLiteral(2)->getEndLoc()`. And the interesting stuff is that `IntegerLiteral::getBeginLoc()` and `IntegerLiteral::getEndLoc()` return the same `Loc`. Although I'm not sure which location these will return, I guess that's why `BinaryOperator::getEndLoc()` doesn't return the end of the expression.

Sorry if I misunderstood anything! After all, I didn't find documents saying which location these `Expr`s' `getEndLoc()` should return. I think it's better to have experts take a look at this.


================
Comment at: clang-tools-extra/test/clang-tidy/checkers/bugprone/implicit-widening-of-multiplication-result-array-subscript-expression.cpp:18
   // CHECK-NOTES-C:                    (ptrdiff_t)( )
   // CHECK-NOTES-CXX:                  static_cast<ptrdiff_t>( )
   // CHECK-NOTES-ALL: :[[@LINE-5]]:16: note: perform multiplication in a wider type
----------------
Actually I have tried adding

```
// CHECK-FIXES-C: return &base[(ptrdiff_t)(a * b)];
// CHECK-FIXES-CXX: return &base[static_cast<ptrdiff_t>(a * b)];
```

under this line, but the test failed, and when I took a look at `build/tools/clang/tools/extra/test/clang-tidy/checkers/bugprone/Output/implicit-widening-of-multiplication-result-array-subscript-expression.cpp.tmp.cpp`, I found that these codes didn't get modified. And I took a look at other files which have `CHECK-FIXES` lines, I found the codes in the corresponding temporary files got fixed.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D141058



More information about the cfe-commits mailing list