From 354a773bfee60755027b0de73c0f68e8ac9b1a51 Mon Sep 17 00:00:00 2001 From: Robert Reif Date: Sun, 16 Jul 2017 11:27:32 -0400 Subject: [PATCH] Fix #8020 (ValueType: no value type for iterator + constant) --- lib/symboldatabase.cpp | 7 +++++++ test/testsymboldatabase.cpp | 17 +++++++++++++++++ 2 files changed, 24 insertions(+) diff --git a/lib/symboldatabase.cpp b/lib/symboldatabase.cpp index 77bcbcbc5..8c8fc5b3e 100644 --- a/lib/symboldatabase.cpp +++ b/lib/symboldatabase.cpp @@ -4872,6 +4872,13 @@ void SymbolDatabase::setValueType(Token *tok, const ValueType &valuetype) setValueType(parent, ValueType(ValueType::Sign::UNKNOWN_SIGN, ValueType::Type::FLOAT, 0U)); return; } + + // iterator +/- integral = iterator + if (vt1->type == ValueType::Type::ITERATOR && vt2 && vt2->isIntegral() && + (parent->str() == "+" || parent->str() == "-")) { + setValueType(parent, *vt1); + return; + } } if (vt1->isIntegral() && vt1->pointer == 0U && diff --git a/test/testsymboldatabase.cpp b/test/testsymboldatabase.cpp index 9e3da933e..07341296d 100644 --- a/test/testsymboldatabase.cpp +++ b/test/testsymboldatabase.cpp @@ -347,6 +347,7 @@ private: TEST_CASE(auto7); TEST_CASE(auto8); TEST_CASE(auto9); // #8044 (segmentation fault) + TEST_CASE(auto10); // #8020 } void array() { @@ -5240,6 +5241,22 @@ private: ASSERT_EQUALS(true, db != nullptr); // not null } + void auto10() { // #8020 + GET_SYMBOL_DB("void f() {\n" + " std::vector ints(4);\n" + " auto iter = ints.begin() + (ints.size() - 1);\n" + "}"); + const Token *autotok = Token::findsimplematch(tokenizer.tokens(), "auto iter"); + + ASSERT(db && autotok && autotok->valueType()); + if (db && autotok && autotok->valueType()) { + ASSERT_EQUALS(0, autotok->valueType()->constness); + ASSERT_EQUALS(0, autotok->valueType()->pointer); + ASSERT_EQUALS(ValueType::UNKNOWN_SIGN, autotok->valueType()->sign); + ASSERT_EQUALS(ValueType::ITERATOR, autotok->valueType()->type); + } + } + }; REGISTER_TEST(TestSymbolDatabase)