From dad455c0dd01470f420bad1a855e6d6781e8b6ee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Marjam=C3=A4ki?= Date: Sun, 26 Feb 2017 20:02:57 +0100 Subject: [PATCH] ValueType: Handle 'auto'. First fix for #4345 --- lib/symboldatabase.cpp | 16 +++++++++++++++- test/testsymboldatabase.cpp | 3 +++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/lib/symboldatabase.cpp b/lib/symboldatabase.cpp index 6d89785c4..778b056e0 100644 --- a/lib/symboldatabase.cpp +++ b/lib/symboldatabase.cpp @@ -4425,6 +4425,14 @@ static void setValueType(Token *tok, const ValueType &valuetype, bool cpp, Value if (parent->isAssignmentOp()) { if (vt1) setValueType(parent, *vt1, cpp, defaultSignedness, settings); + else if (cpp && Token::Match(parent->tokAt(-5), "[;{}] auto %var% ; %var% =")) { + Token *autoTok = parent->tokAt(-4); + if (autoTok->strAt(1) == parent->strAt(-1)) { + setValueType(autoTok, *vt2, cpp, defaultSignedness, settings); + setValueType(autoTok->next(), *vt2, cpp, defaultSignedness, settings); + setValueType(parent->previous(), *vt2, cpp, defaultSignedness, settings); + } + } return; } @@ -4604,7 +4612,13 @@ static const Token * parsedecl(const Token *type, ValueType * const valuetype, V valuetype->type = ValueType::Type::FLOAT; else if (type->str() == "double") valuetype->type = type->isLong() ? ValueType::Type::LONGDOUBLE : ValueType::Type::DOUBLE; - else if (!valuetype->typeScope && (type->str() == "struct" || type->str() == "enum")) + else if (type->str() == "auto" && type->valueType()) { + const ValueType *vt = type->valueType(); + valuetype->type = vt->type; + valuetype->pointer = vt->pointer; + if (vt->sign != ValueType::Sign::UNKNOWN_SIGN) + valuetype->sign = vt->sign; + } else if (!valuetype->typeScope && (type->str() == "struct" || type->str() == "enum")) valuetype->type = ValueType::Type::NONSTD; else if (!valuetype->typeScope && type->type() && type->type()->classScope) { valuetype->type = ValueType::Type::NONSTD; diff --git a/test/testsymboldatabase.cpp b/test/testsymboldatabase.cpp index aa459c133..08db2b76f 100644 --- a/test/testsymboldatabase.cpp +++ b/test/testsymboldatabase.cpp @@ -4238,6 +4238,9 @@ private: ASSERT_EQUALS(true, vt.fromLibraryType("s32", &settingsUnix32)); ASSERT_EQUALS(ValueType::Type::INT, vt.type); } + + // auto variables + ASSERT_EQUALS("signed int", typeOf("; auto x = 3;", "auto")); } void variadic1() { // #7453