diff --git a/lib/symboldatabase.cpp b/lib/symboldatabase.cpp index ca40cd815..1dd760dca 100644 --- a/lib/symboldatabase.cpp +++ b/lib/symboldatabase.cpp @@ -6202,6 +6202,8 @@ void SymbolDatabase::setValueType(Token* tok, const ValueType& valuetype, Source autoTok = var1Tok->previous(); else if (Token::Match(var1Tok->tokAt(-2), "auto *|&|&&")) autoTok = var1Tok->tokAt(-2); + else if (Token::simpleMatch(var1Tok->tokAt(-3), "auto * const")) + autoTok = var1Tok->tokAt(-3); if (autoTok) { ValueType vt(*vt2); if (vt.constness & (1 << vt.pointer)) @@ -6226,6 +6228,8 @@ void SymbolDatabase::setValueType(Token* tok, const ValueType& valuetype, Source vt2_.constness |= (1 << vt2->pointer); if (!Token::Match(autoTok->tokAt(1), "*|&")) vt2_.constness = vt.constness; + if (Token::simpleMatch(autoTok->tokAt(1), "* const")) + vt2_.constness |= (1 << vt2->pointer); var->setValueType(vt2_); if (vt2->typeScope && vt2->typeScope->definedType) { var->type(vt2->typeScope->definedType); diff --git a/test/testsymboldatabase.cpp b/test/testsymboldatabase.cpp index 1faa936d0..bdaae44fc 100644 --- a/test/testsymboldatabase.cpp +++ b/test/testsymboldatabase.cpp @@ -8401,6 +8401,24 @@ private: ASSERT(tok && tok->valueType()); ASSERT_EQUALS("signed int", tok->valueType()->str()); } + { + GET_SYMBOL_DB("void f(const std::string& s) {\n" + " const auto* const p = s.data();\n" + "}\n"); + ASSERT_EQUALS("", errout.str()); + + const Token* tok = tokenizer.tokens(); + tok = Token::findsimplematch(tok, "auto"); + ASSERT(tok && tok->valueType()); + ASSERT_EQUALS(ValueType::CHAR, tok->valueType()->type); + ASSERT_EQUALS(1, tok->valueType()->constness); + ASSERT_EQUALS(0, tok->valueType()->pointer); + tok = Token::findsimplematch(tok, "p"); + ASSERT(tok && tok->variable() && tok->variable()->valueType()); + ASSERT_EQUALS(ValueType::CHAR, tok->variable()->valueType()->type); + ASSERT_EQUALS(3, tok->variable()->valueType()->constness); + ASSERT_EQUALS(1, tok->variable()->valueType()->pointer); + } } void valueTypeThis() {