diff --git a/clang-tools-extra/clang-tidy/modernize/UseIntegerSignComparisonCheck.cpp b/clang-tools-extra/clang-tidy/modernize/UseIntegerSignComparisonCheck.cpp index 0003429c62890..a3d3f0fa0ec93 100644 --- a/clang-tools-extra/clang-tidy/modernize/UseIntegerSignComparisonCheck.cpp +++ b/clang-tools-extra/clang-tidy/modernize/UseIntegerSignComparisonCheck.cpp @@ -34,13 +34,12 @@ AST_MATCHER(clang::QualType, isActualChar) { } // namespace static BindableMatcher -intCastExpression(bool IsSigned, - const std::string &CastBindName = std::string()) { +intCastExpression(bool IsSigned, StringRef CastBindName = {}) { // std::cmp_{} functions trigger a compile-time error if either LHS or RHS // is a non-integer type, char, enum or bool // (unsigned char/ signed char are Ok and can be used). auto IntTypeExpr = expr(hasType(hasCanonicalType(qualType( - isInteger(), IsSigned ? isSignedInteger() : isUnsignedInteger(), + IsSigned ? isSignedInteger() : isUnsignedInteger(), unless(isActualChar()), unless(booleanType()), unless(enumType()))))); const auto ImplicitCastExpr = @@ -71,7 +70,7 @@ static StringRef parseOpCode(BinaryOperator::Opcode Code) { case BO_NE: return "cmp_not_equal"; default: - return ""; + llvm_unreachable("invalid opcode"); } } @@ -119,23 +118,16 @@ void UseIntegerSignComparisonCheck::check( Expr::EvalResult EVResult; if (!SignedCastExpression->isValueDependent() && SignedCastExpression->getSubExpr()->EvaluateAsInt(EVResult, - *Result.Context)) { - const llvm::APSInt SValue = EVResult.Val.getInt(); - if (SValue.isNonNegative()) - return; - } + *Result.Context) && + EVResult.Val.getInt().isNonNegative()) + return; const auto *BinaryOp = Result.Nodes.getNodeAs("intComparison"); - if (BinaryOp == nullptr) - return; - - const BinaryOperator::Opcode OpCode = BinaryOp->getOpcode(); + assert(BinaryOp); const Expr *LHS = BinaryOp->getLHS()->IgnoreImpCasts(); const Expr *RHS = BinaryOp->getRHS()->IgnoreImpCasts(); - if (LHS == nullptr || RHS == nullptr) - return; const Expr *SubExprLHS = nullptr; const Expr *SubExprRHS = nullptr; SourceRange R1(LHS->getBeginLoc()); @@ -144,8 +136,7 @@ void UseIntegerSignComparisonCheck::check( RHS->getEndLoc(), 0, *Result.SourceManager, getLangOpts())); if (const auto *LHSCast = llvm::dyn_cast(LHS)) { SubExprLHS = LHSCast->getSubExpr(); - R1 = SourceRange(LHS->getBeginLoc(), - SubExprLHS->getBeginLoc().getLocWithOffset(-1)); + R1.setEnd(SubExprLHS->getBeginLoc().getLocWithOffset(-1)); R2.setBegin(Lexer::getLocForEndOfToken( SubExprLHS->getEndLoc(), 0, *Result.SourceManager, getLangOpts())); } @@ -156,21 +147,21 @@ void UseIntegerSignComparisonCheck::check( DiagnosticBuilder Diag = diag(BinaryOp->getBeginLoc(), "comparison between 'signed' and 'unsigned' integers"); - std::string CmpNamespace; - llvm::StringRef CmpHeader; + StringRef CmpNamespace; + StringRef CmpHeader; if (getLangOpts().CPlusPlus20) { CmpHeader = ""; - CmpNamespace = llvm::Twine("std::" + parseOpCode(OpCode)).str(); + CmpNamespace = "std::"; } else if (getLangOpts().CPlusPlus17 && EnableQtSupport) { CmpHeader = ""; - CmpNamespace = llvm::Twine("q20::" + parseOpCode(OpCode)).str(); + CmpNamespace = "q20::"; } // Prefer modernize-use-integer-sign-comparison when C++20 is available! Diag << FixItHint::CreateReplacement( CharSourceRange(R1, SubExprLHS != nullptr), - llvm::Twine(CmpNamespace + "(").str()); + Twine(CmpNamespace + parseOpCode(BinaryOp->getOpcode()) + "(").str()); Diag << FixItHint::CreateReplacement(R2, ","); Diag << FixItHint::CreateReplacement(CharSourceRange::getCharRange(R3), ")");