diff --git a/lib/token.h b/lib/token.h index b87430af3f5..c9e8c68ee4a 100644 --- a/lib/token.h +++ b/lib/token.h @@ -751,11 +751,12 @@ class CPPCHECKLIB Token { bool isCChar() const { return (((mTokType == eString) && isPrefixStringCharLiteral(mStr, '"', emptyString)) || - ((mTokType == eChar) && isPrefixStringCharLiteral(mStr, '\'', emptyString) && mStr.length() == 3)); + ((mTokType == eChar) && isPrefixStringCharLiteral(mStr, '\'', emptyString) && mStr.length() == 3) || + ((mTokType == eChar) && isPrefixStringCharLiteral(mStr, '\'', emptyString) && mStr.compare(0, 2, "\'\\") == 0 && mStr.length() == 4)); } bool isCMultiChar() const { - return (((mTokType == eChar) && isPrefixStringCharLiteral(mStr, '\'', emptyString)) && + return (((mTokType == eChar) && isPrefixStringCharLiteral(mStr, '\'', emptyString)) && (mStr.compare(0, 2, "\'\\") != 0 || mStr.length() > 4) && (mStr.length() > 3)); } /** diff --git a/test/testsymboldatabase.cpp b/test/testsymboldatabase.cpp index 10276b3dc72..50346041a10 100644 --- a/test/testsymboldatabase.cpp +++ b/test/testsymboldatabase.cpp @@ -8887,6 +8887,7 @@ class TestSymbolDatabase : public TestFixture { // char ASSERT_EQUALS("char", typeOf("'a';", "'a'", true)); + ASSERT_EQUALS("char", typeOf("'\\\'';", "'\\\''", true)); ASSERT_EQUALS("signed int", typeOf("'a';", "'a'", false)); ASSERT_EQUALS("wchar_t", typeOf("L'a';", "L'a'", true)); ASSERT_EQUALS("wchar_t", typeOf("L'a';", "L'a'", false)); diff --git a/test/testtoken.cpp b/test/testtoken.cpp index e2ff0ab0e1b..238bff97bae 100644 --- a/test/testtoken.cpp +++ b/test/testtoken.cpp @@ -355,6 +355,22 @@ class TestToken : public TestFixture { ASSERT_EQUALS(false, tok.isUtf32()); ASSERT_EQUALS(false, tok.isLong()); ASSERT_EQUALS(true, tok.isCMultiChar()); + + tok.str("'\\''"); + ASSERT_EQUALS(true, tok.isCChar()); + ASSERT_EQUALS(false, tok.isUtf8()); + ASSERT_EQUALS(false, tok.isUtf16()); + ASSERT_EQUALS(false, tok.isUtf32()); + ASSERT_EQUALS(false, tok.isLong()); + ASSERT_EQUALS(false, tok.isCMultiChar()); + + tok.str("'\\r\\n'"); + ASSERT_EQUALS(false, tok.isCChar()); + ASSERT_EQUALS(false, tok.isUtf8()); + ASSERT_EQUALS(false, tok.isUtf16()); + ASSERT_EQUALS(false, tok.isUtf32()); + ASSERT_EQUALS(false, tok.isLong()); + ASSERT_EQUALS(true, tok.isCMultiChar()); } void stringTypes() const {