Skip to content

Commit 0bd341f

Browse files
authored
Fix #12929: ValueType: char literal '\'' gets valuetype 'int' (#6588)
1 parent ed54609 commit 0bd341f

3 files changed

Lines changed: 20 additions & 2 deletions

File tree

lib/token.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -751,11 +751,12 @@ class CPPCHECKLIB Token {
751751

752752
bool isCChar() const {
753753
return (((mTokType == eString) && isPrefixStringCharLiteral(mStr, '"', emptyString)) ||
754-
((mTokType == eChar) && isPrefixStringCharLiteral(mStr, '\'', emptyString) && mStr.length() == 3));
754+
((mTokType == eChar) && isPrefixStringCharLiteral(mStr, '\'', emptyString) && mStr.length() == 3) ||
755+
((mTokType == eChar) && isPrefixStringCharLiteral(mStr, '\'', emptyString) && mStr.compare(0, 2, "\'\\") == 0 && mStr.length() == 4));
755756
}
756757

757758
bool isCMultiChar() const {
758-
return (((mTokType == eChar) && isPrefixStringCharLiteral(mStr, '\'', emptyString)) &&
759+
return (((mTokType == eChar) && isPrefixStringCharLiteral(mStr, '\'', emptyString)) && (mStr.compare(0, 2, "\'\\") != 0 || mStr.length() > 4) &&
759760
(mStr.length() > 3));
760761
}
761762
/**

test/testsymboldatabase.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8887,6 +8887,7 @@ class TestSymbolDatabase : public TestFixture {
88878887

88888888
// char
88898889
ASSERT_EQUALS("char", typeOf("'a';", "'a'", true));
8890+
ASSERT_EQUALS("char", typeOf("'\\\'';", "'\\\''", true));
88908891
ASSERT_EQUALS("signed int", typeOf("'a';", "'a'", false));
88918892
ASSERT_EQUALS("wchar_t", typeOf("L'a';", "L'a'", true));
88928893
ASSERT_EQUALS("wchar_t", typeOf("L'a';", "L'a'", false));

test/testtoken.cpp

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -355,6 +355,22 @@ class TestToken : public TestFixture {
355355
ASSERT_EQUALS(false, tok.isUtf32());
356356
ASSERT_EQUALS(false, tok.isLong());
357357
ASSERT_EQUALS(true, tok.isCMultiChar());
358+
359+
tok.str("'\\''");
360+
ASSERT_EQUALS(true, tok.isCChar());
361+
ASSERT_EQUALS(false, tok.isUtf8());
362+
ASSERT_EQUALS(false, tok.isUtf16());
363+
ASSERT_EQUALS(false, tok.isUtf32());
364+
ASSERT_EQUALS(false, tok.isLong());
365+
ASSERT_EQUALS(false, tok.isCMultiChar());
366+
367+
tok.str("'\\r\\n'");
368+
ASSERT_EQUALS(false, tok.isCChar());
369+
ASSERT_EQUALS(false, tok.isUtf8());
370+
ASSERT_EQUALS(false, tok.isUtf16());
371+
ASSERT_EQUALS(false, tok.isUtf32());
372+
ASSERT_EQUALS(false, tok.isLong());
373+
ASSERT_EQUALS(true, tok.isCMultiChar());
358374
}
359375

360376
void stringTypes() const {

0 commit comments

Comments
 (0)