11 #include "clang/AST/ASTContext.h"
12 #include "clang/ASTMatchers/ASTMatchFinder.h"
13 #include "clang/Lex/Lexer.h"
15 using namespace clang::ast_matchers;
21 void StringIntegerAssignmentCheck::registerMatchers(MatchFinder *
Finder) {
22 if (!getLangOpts().CPlusPlus)
26 anyOf(hasOverloadedOperatorName(
"="),
27 hasOverloadedOperatorName(
"+=")),
28 callee(cxxMethodDecl(ofClass(classTemplateSpecializationDecl(
29 hasName(
"::std::basic_string"),
30 hasTemplateArgument(0, refersToType(qualType().bind(
"type"))))))),
32 ignoringImpCasts(expr(hasType(isInteger()),
33 unless(hasType(isAnyCharacter())))
35 unless(isInTemplateInstantiation())),
39 void StringIntegerAssignmentCheck::check(
40 const MatchFinder::MatchResult &Result) {
41 const auto *
Argument = Result.Nodes.getNodeAs<Expr>(
"expr");
45 diag(Loc,
"an integer is interpreted as a character code when assigning "
46 "it to a string; if this is intended, cast the integer to the "
47 "appropriate character type; if you want a string "
48 "representation, use the appropriate conversion facility");
53 auto CharType = *Result.Nodes.getNodeAs<QualType>(
"type");
54 bool IsWideCharType = CharType->isWideCharType();
55 if (!CharType->isCharType() && !IsWideCharType)
57 bool IsOneDigit =
false;
58 bool IsLiteral =
false;
59 if (
const auto *Literal = dyn_cast<IntegerLiteral>(
Argument)) {
60 IsOneDigit = Literal->getValue().getLimitedValue() < 10;
64 SourceLocation EndLoc = Lexer::getLocForEndOfToken(
65 Argument->getLocEnd(), 0, *Result.SourceManager, getLangOpts());
67 Diag << FixItHint::CreateInsertion(Loc, IsWideCharType ?
"L'" :
"'")
68 << FixItHint::CreateInsertion(EndLoc,
"'");
72 Diag << FixItHint::CreateInsertion(Loc, IsWideCharType ?
"L\"" :
"\"")
73 << FixItHint::CreateInsertion(EndLoc,
"\"");
77 if (getLangOpts().CPlusPlus11) {
78 Diag << FixItHint::CreateInsertion(Loc, IsWideCharType ?
"std::to_wstring("
80 << FixItHint::CreateInsertion(EndLoc,
")");
SourceLocation Loc
'#' location in the include directive
This class represents one callback function argument by name and value.
std::unique_ptr< ast_matchers::MatchFinder > Finder