diff --git a/clang-tools-extra/clang-tidy/bugprone/ImplicitWideningOfMultiplicationResultCheck.cpp b/clang-tools-extra/clang-tidy/bugprone/ImplicitWideningOfMultiplicationResultCheck.cpp --- a/clang-tools-extra/clang-tidy/bugprone/ImplicitWideningOfMultiplicationResultCheck.cpp +++ b/clang-tools-extra/clang-tidy/bugprone/ImplicitWideningOfMultiplicationResultCheck.cpp @@ -9,6 +9,7 @@ #include "ImplicitWideningOfMultiplicationResultCheck.h" #include "clang/AST/ASTContext.h" #include "clang/ASTMatchers/ASTMatchFinder.h" +#include "clang/Lex/Lexer.h" using namespace clang::ast_matchers; @@ -95,20 +96,25 @@ "%0 of a multiplication performed in type %1") << Ty << E->getType(); + const SourceManager &SM = Context->getSourceManager(); + const LangOptions &LangOpts = Context->getLangOpts(); + { auto Diag = diag(E->getBeginLoc(), "make conversion explicit to silence this warning", DiagnosticIDs::Note) << E->getSourceRange(); + SourceLocation LocForEndOfToken = + Lexer::getLocForEndOfToken(E->getEndLoc(), 0, SM, LangOpts); if (ShouldUseCXXStaticCast) Diag << FixItHint::CreateInsertion( E->getBeginLoc(), "static_cast<" + Ty.getAsString() + ">(") - << FixItHint::CreateInsertion(E->getEndLoc(), ")"); + << FixItHint::CreateInsertion(LocForEndOfToken, ")"); else Diag << FixItHint::CreateInsertion(E->getBeginLoc(), "(" + Ty.getAsString() + ")(") - << FixItHint::CreateInsertion(E->getEndLoc(), ")"); + << FixItHint::CreateInsertion(LocForEndOfToken, ")"); Diag << includeStddefHeader(E->getBeginLoc()); } @@ -138,7 +144,9 @@ Diag << FixItHint::CreateInsertion(LHS->getBeginLoc(), "static_cast<" + WideExprTy.getAsString() + ">(") - << FixItHint::CreateInsertion(LHS->getEndLoc(), ")"); + << FixItHint::CreateInsertion( + Lexer::getLocForEndOfToken(LHS->getEndLoc(), 0, SM, LangOpts), + ")"); else Diag << FixItHint::CreateInsertion(LHS->getBeginLoc(), "(" + WideExprTy.getAsString() + ")"); @@ -202,21 +210,26 @@ "an implicit widening conversion to type '%1'") << IndexExprType << TyAsString; + const SourceManager &SM = Context->getSourceManager(); + const LangOptions &LangOpts = Context->getLangOpts(); + { auto Diag = diag(IndexExpr->getBeginLoc(), "make conversion explicit to silence this warning", DiagnosticIDs::Note) << IndexExpr->getSourceRange(); + SourceLocation LocForEndOfToken = + Lexer::getLocForEndOfToken(IndexExpr->getEndLoc(), 0, SM, LangOpts); if (ShouldUseCXXStaticCast) Diag << FixItHint::CreateInsertion( IndexExpr->getBeginLoc(), (Twine("static_cast<") + TyAsString + ">(").str()) - << FixItHint::CreateInsertion(IndexExpr->getEndLoc(), ")"); + << FixItHint::CreateInsertion(LocForEndOfToken, ")"); else Diag << FixItHint::CreateInsertion(IndexExpr->getBeginLoc(), (Twine("(") + TyAsString + ")(").str()) - << FixItHint::CreateInsertion(IndexExpr->getEndLoc(), ")"); + << FixItHint::CreateInsertion(LocForEndOfToken, ")"); Diag << includeStddefHeader(IndexExpr->getBeginLoc()); } @@ -230,7 +243,9 @@ Diag << FixItHint::CreateInsertion( LHS->getBeginLoc(), (Twine("static_cast<") + TyAsString + ">(").str()) - << FixItHint::CreateInsertion(LHS->getEndLoc(), ")"); + << FixItHint::CreateInsertion( + Lexer::getLocForEndOfToken(LHS->getEndLoc(), 0, SM, LangOpts), + ")"); else Diag << FixItHint::CreateInsertion(LHS->getBeginLoc(), (Twine("(") + TyAsString + ")").str()); diff --git a/clang-tools-extra/test/clang-tidy/checkers/bugprone/implicit-widening-of-multiplication-result-array-subscript-expression.cpp b/clang-tools-extra/test/clang-tidy/checkers/bugprone/implicit-widening-of-multiplication-result-array-subscript-expression.cpp --- a/clang-tools-extra/test/clang-tidy/checkers/bugprone/implicit-widening-of-multiplication-result-array-subscript-expression.cpp +++ b/clang-tools-extra/test/clang-tidy/checkers/bugprone/implicit-widening-of-multiplication-result-array-subscript-expression.cpp @@ -18,7 +18,7 @@ // CHECK-NOTES-CXX: static_cast( ) // CHECK-NOTES-ALL: :[[@LINE-5]]:16: note: perform multiplication in a wider type // CHECK-NOTES-C: (ptrdiff_t) - // CHECK-NOTES-CXX: static_cast() + // CHECK-NOTES-CXX: static_cast( ) } void *t1(char *base, int a, int b) { return &((a * b)[base]); @@ -35,7 +35,7 @@ // CHECK-NOTES-CXX: static_cast( ) // CHECK-NOTES-ALL: :[[@LINE-5]]:16: note: perform multiplication in a wider type // CHECK-NOTES-C: (size_t) - // CHECK-NOTES-CXX: static_cast() + // CHECK-NOTES-CXX: static_cast( ) } char *t3(char *base, int a, unsigned int b) { diff --git a/clang-tools-extra/test/clang-tidy/checkers/bugprone/implicit-widening-of-multiplication-result-int.cpp b/clang-tools-extra/test/clang-tidy/checkers/bugprone/implicit-widening-of-multiplication-result-int.cpp --- a/clang-tools-extra/test/clang-tidy/checkers/bugprone/implicit-widening-of-multiplication-result-int.cpp +++ b/clang-tools-extra/test/clang-tidy/checkers/bugprone/implicit-widening-of-multiplication-result-int.cpp @@ -18,7 +18,7 @@ // CHECK-NOTES-CXX: static_cast( ) // CHECK-NOTES-ALL: :[[@LINE-5]]:10: note: perform multiplication in a wider type // CHECK-NOTES-C: (long) - // CHECK-NOTES-CXX: static_cast() + // CHECK-NOTES-CXX: static_cast( ) } unsigned long t1(int a, int b) { return a * b; @@ -28,7 +28,7 @@ // CHECK-NOTES-CXX: static_cast( ) // CHECK-NOTES-ALL: :[[@LINE-5]]:10: note: perform multiplication in a wider type // CHECK-NOTES-C: (long) - // CHECK-NOTES-CXX: static_cast() + // CHECK-NOTES-CXX: static_cast( ) } long t2(unsigned int a, int b) { @@ -39,7 +39,7 @@ // CHECK-NOTES-CXX: static_cast( ) // CHECK-NOTES-ALL: :[[@LINE-5]]:10: note: perform multiplication in a wider type // CHECK-NOTES-C: (unsigned long) - // CHECK-NOTES-CXX: static_cast() + // CHECK-NOTES-CXX: static_cast( ) } unsigned long t3(unsigned int a, int b) { return a * b; @@ -49,7 +49,7 @@ // CHECK-NOTES-CXX: static_cast( ) // CHECK-NOTES-ALL: :[[@LINE-5]]:10: note: perform multiplication in a wider type // CHECK-NOTES-C: (unsigned long) - // CHECK-NOTES-CXX: static_cast() + // CHECK-NOTES-CXX: static_cast( ) } long t4(int a, unsigned int b) { diff --git a/clang-tools-extra/test/clang-tidy/checkers/bugprone/implicit-widening-of-multiplication-result-pointer-offset.cpp b/clang-tools-extra/test/clang-tidy/checkers/bugprone/implicit-widening-of-multiplication-result-pointer-offset.cpp --- a/clang-tools-extra/test/clang-tidy/checkers/bugprone/implicit-widening-of-multiplication-result-pointer-offset.cpp +++ b/clang-tools-extra/test/clang-tidy/checkers/bugprone/implicit-widening-of-multiplication-result-pointer-offset.cpp @@ -18,7 +18,7 @@ // CHECK-NOTES-CXX: static_cast( ) // CHECK-NOTES-ALL: :[[@LINE-5]]:17: note: perform multiplication in a wider type // CHECK-NOTES-C: (ptrdiff_t) - // CHECK-NOTES-CXX: static_cast() + // CHECK-NOTES-CXX: static_cast( ) } char *t1(char *base, int a, int b) { return a * b + base; @@ -35,7 +35,7 @@ // CHECK-NOTES-CXX: static_cast( ) // CHECK-NOTES-ALL: :[[@LINE-5]]:17: note: perform multiplication in a wider type // CHECK-NOTES-C: (size_t) - // CHECK-NOTES-CXX: static_cast() + // CHECK-NOTES-CXX: static_cast( ) } char *t3(char *base, int a, unsigned int b) {