diff --git a/lib/symboldatabase.cpp b/lib/symboldatabase.cpp index c47404fc9..87fe30af0 100644 --- a/lib/symboldatabase.cpp +++ b/lib/symboldatabase.cpp @@ -4621,9 +4621,9 @@ void SymbolDatabase::setValueType(Token *tok, const ValueType &valuetype) Token::Match(parent->tokAt(-1), "%var% ="))) { Token *var1Tok = parent->strAt(-2) == ";" ? parent->tokAt(-3) : parent->tokAt(-1); Token *autoTok = nullptr; - if (Token::Match(var1Tok->tokAt(-2), ";|{|}|const auto")) + if (Token::Match(var1Tok->tokAt(-2), ";|{|}|(|const auto")) autoTok = var1Tok->previous(); - else if (Token::Match(var1Tok->tokAt(-3), ";|{|}|const auto *")) + else if (Token::Match(var1Tok->tokAt(-3), ";|{|}|(|const auto *")) autoTok = var1Tok->tokAt(-2); if (autoTok) { ValueType vt(*vt2); @@ -4635,11 +4635,11 @@ void SymbolDatabase::setValueType(Token *tok, const ValueType &valuetype) setAutoTokenProperties(autoTok); setValueType(var1Tok, *vt2); setValueType(parent->previous(), *vt2); - const Variable *var = parent->previous()->variable(); + Variable *var = const_cast(parent->previous()->variable()); if (var) { - const_cast(var)->setFlags(*vt2); + var->setFlags(*vt2); if (vt2->typeScope && vt2->typeScope->definedType) { - const_cast(var)->type(vt2->typeScope->definedType); + var->type(vt2->typeScope->definedType); if (autoTok->valueType()->pointer == 0) autoTok->type(vt2->typeScope->definedType); } diff --git a/test/testsymboldatabase.cpp b/test/testsymboldatabase.cpp index 6d5c82aa5..a6fdf26b0 100644 --- a/test/testsymboldatabase.cpp +++ b/test/testsymboldatabase.cpp @@ -328,6 +328,7 @@ private: TEST_CASE(auto5); TEST_CASE(auto6); // #7963 (segmentation fault) TEST_CASE(auto7); + TEST_CASE(auto8); } void array() { @@ -5111,6 +5112,31 @@ private: } } + void auto8() { + GET_SYMBOL_DB("std::vector vec;\n" + "void foo() {\n" + " for (auto it = vec.begin(); it != vec.end(); ++it) { }\n" + "}"); + const Token *autotok = Token::findsimplematch(tokenizer.tokens(), "auto it"); + + 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); + } + + vartok = Token::findsimplematch(autotok, "it ="); + ASSERT(db && vartok && vartok->valueType()); + if (db && vartok && vartok->valueType()) { + ASSERT_EQUALS(0, vartok->valueType()->constness); + ASSERT_EQUALS(0, vartok->valueType()->pointer); + ASSERT_EQUALS(ValueType::UNKNOWN_SIGN, vartok->valueType()->sign); + ASSERT_EQUALS(ValueType::ITERATOR, vartok->valueType()->type); + } + } + }; REGISTER_TEST(TestSymbolDatabase)