From 9ac152597e3a8c892fd1c46e8af20aff5fd1ee61 Mon Sep 17 00:00:00 2001 From: Oleksandr Labetskyi Date: Thu, 11 Jul 2024 18:05:28 +0300 Subject: [PATCH] Fix #12929: ValueType: char literal '\'' gets valuetype 'int' --- lib/symboldatabase.cpp | 2 +- test/testsymboldatabase.cpp | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/symboldatabase.cpp b/lib/symboldatabase.cpp index 40c18bdbff6..2a17badd34d 100644 --- a/lib/symboldatabase.cpp +++ b/lib/symboldatabase.cpp @@ -7422,7 +7422,7 @@ void SymbolDatabase::setValueTypeInTokenList(bool reportDebugWarnings, Token *to } else if (tok->isLong()) { valuetype.originalTypeName = "wchar_t"; valuetype.type = ValueType::Type::WCHAR_T; - } else if ((tok->tokType() == Token::eChar) && ((!tok->isCpp() && tok->isCChar()) || (tok->isCMultiChar()))) { + } else if ((tok->tokType() == Token::eChar) && ((!tok->isCpp() && tok->isCChar()) || (tok->isCMultiChar() && !isPrefixStringCharLiteral(tok->str(), '\'', "\'\\")))) { valuetype.type = ValueType::Type::INT; valuetype.sign = ValueType::Sign::SIGNED; } 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));