}
bool containsEscapedCharacters(const MatchFinder::MatchResult &Result,
- const StringLiteral *Literal) {
+ const StringLiteral *Literal,
+ const CharsBitSet &DisallowedChars) {
// FIXME: Handle L"", u8"", u"" and U"" literals.
if (!Literal->isAscii())
return false;
- StringRef Bytes = Literal->getBytes();
- // Non-printing characters disqualify this literal:
- // \007 = \a bell
- // \010 = \b backspace
- // \011 = \t horizontal tab
- // \012 = \n new line
- // \013 = \v vertical tab
- // \014 = \f form feed
- // \015 = \r carriage return
- // \177 = delete
- if (Bytes.find_first_of(StringRef("\000\001\002\003\004\005\006\a"
- "\b\t\n\v\f\r\016\017"
- "\020\021\022\023\024\025\026\027"
- "\030\031\032\033\034\035\036\037"
- "\177",
- 33)) != StringRef::npos)
- return false;
+ for (const unsigned char C : Literal->getBytes())
+ if (DisallowedChars.test(C))
+ return false;
CharSourceRange CharRange = Lexer::makeFileCharRange(
CharSourceRange::getTokenRange(Literal->getSourceRange()),
ClangTidyContext *Context)
: ClangTidyCheck(Name, Context),
DelimiterStem(Options.get("DelimiterStem", "lit")),
- ReplaceShorterLiterals(Options.get("ReplaceShorterLiterals", false)) {}
+ ReplaceShorterLiterals(Options.get("ReplaceShorterLiterals", false)) {
+ // Non-printing characters are disallowed:
+ // \007 = \a bell
+ // \010 = \b backspace
+ // \011 = \t horizontal tab
+ // \012 = \n new line
+ // \013 = \v vertical tab
+ // \014 = \f form feed
+ // \015 = \r carriage return
+ // \177 = delete
+ for (const unsigned char C : StringRef("\000\001\002\003\004\005\006\a"
+ "\b\t\n\v\f\r\016\017"
+ "\020\021\022\023\024\025\026\027"
+ "\030\031\032\033\034\035\036\037"
+ "\177",
+ 33))
+ DisallowedChars.set(C);
+
+ // Non-ASCII are disallowed too.
+ for (unsigned int C = 0x80u; C <= 0xFFu; ++C)
+ DisallowedChars.set(static_cast<unsigned char>(C));
+}
void RawStringLiteralCheck::storeOptions(ClangTidyOptions::OptionMap &Options) {
ClangTidyCheck::storeOptions(Options);
if (Literal->getLocStart().isMacroID())
return;
- if (containsEscapedCharacters(Result, Literal)) {
+ if (containsEscapedCharacters(Result, Literal, DisallowedChars)) {
std::string Replacement = asRawStringLiteral(Literal, DelimiterStem);
if (ReplaceShorterLiterals ||
Replacement.length() <=