From 830f901206d89d595fef315ecb62b24e57c00b65 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Marjam=C3=A4ki?= Date: Mon, 27 Jan 2020 11:46:59 +0100 Subject: [PATCH] Fixed #9586 (Valuetype: Wrong type for 'true << 1') --- lib/symboldatabase.cpp | 13 +++++++++++-- test/testsymboldatabase.cpp | 1 + 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/lib/symboldatabase.cpp b/lib/symboldatabase.cpp index 15b30f1e2..d566ec7e6 100644 --- a/lib/symboldatabase.cpp +++ b/lib/symboldatabase.cpp @@ -5182,8 +5182,17 @@ void SymbolDatabase::setValueType(Token *tok, const ValueType &valuetype) const ValueType *vt2 = parent->astOperand2() ? parent->astOperand2()->valueType() : nullptr; if (vt1 && Token::Match(parent, "<<|>>")) { - if (!mIsCpp || (vt2 && vt2->isIntegral())) - setValueType(parent, *vt1); + if (!mIsCpp || (vt2 && vt2->isIntegral())) { + if (vt1->type < ValueType::Type::BOOL || vt1->type >= ValueType::Type::INT) + setValueType(parent, *vt1); + else { + ValueType vt(*vt1); + vt.type = ValueType::Type::INT; // Integer promotion + vt.sign = ValueType::Sign::SIGNED; + setValueType(parent, vt); + } + + } return; } diff --git a/test/testsymboldatabase.cpp b/test/testsymboldatabase.cpp index fc40abf16..d29d5422c 100644 --- a/test/testsymboldatabase.cpp +++ b/test/testsymboldatabase.cpp @@ -6564,6 +6564,7 @@ private: ASSERT_EQUALS("signed int", typeOf("a = 12 >> x;", ">>", "test.c")); ASSERT_EQUALS("", typeOf("a = 12 << x;", "<<", "test.cpp")); // << might be overloaded ASSERT_EQUALS("signed int", typeOf("a = 12 << x;", "<<", "test.c")); + ASSERT_EQUALS("signed int", typeOf("a = true << 1U;", "<<")); // assignment => result has same type as lhs ASSERT_EQUALS("unsigned short", typeOf("unsigned short x; x = 3;", "="));