From 269850a62dc49017412f16a8a6bfc2e587ee32c6 Mon Sep 17 00:00:00 2001 From: chrchr-github <78114321+chrchr-github@users.noreply.github.com> Date: Sun, 30 Apr 2023 20:36:27 +0200 Subject: [PATCH] Fix autoNoType with multiple auto variables (#5012) --- lib/token.cpp | 2 ++ test/testautovariables.cpp | 11 ++++++----- test/testsymboldatabase.cpp | 13 +++++++++++++ 3 files changed, 21 insertions(+), 5 deletions(-) diff --git a/lib/token.cpp b/lib/token.cpp index bbd401dd7..40f90ae29 100644 --- a/lib/token.cpp +++ b/lib/token.cpp @@ -2286,6 +2286,8 @@ std::pair Token::typeDecl(const Token* tok, bool poi varTok = varTok->next(); while (Token::Match(varTok, "%name% ::")) varTok = varTok->tokAt(2); + if (Token::simpleMatch(varTok, "(") && Token::simpleMatch(varTok->astOperand1(), ".")) + varTok = varTok->astOperand1()->astOperand1(); std::pair r = typeDecl(varTok); if (r.first) return r; diff --git a/test/testautovariables.cpp b/test/testautovariables.cpp index fadc184f5..9aef98353 100644 --- a/test/testautovariables.cpp +++ b/test/testautovariables.cpp @@ -2274,7 +2274,7 @@ private: "}"); ASSERT_EQUALS("", errout.str()); - check("auto f() {\n" + check("std::vector::iterator f() {\n" " std::vector x;\n" " auto it = x.begin();\n" " return it;\n" @@ -2288,7 +2288,7 @@ private: "}"); ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:2] -> [test.cpp:4]: (error) Returning iterator to local container 'x' that will be invalid when returning.\n", errout.str()); - check("auto f() {\n" + check("int* f() {\n" " std::vector x;\n" " auto p = x.data();\n" " return p;\n" @@ -2315,7 +2315,7 @@ private: "[test.cpp:3] -> [test.cpp:4] -> [test.cpp:2] -> [test.cpp:4]: (error) Returning pointer to local variable 'v' that will be invalid when returning.\n", errout.str()); - check("auto f(std::vector x) {\n" + check("std::vector::iterator f(std::vector x) {\n" " auto it = x.begin();\n" " return it;\n" "}"); @@ -2447,11 +2447,12 @@ private: errout.str()); check("std::vector g();\n" - "auto f() {\n" + "std::vector::iterator f() {\n" " auto it = g().begin();\n" " return it;\n" "}"); - ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:4]: (error) Returning iterator that will be invalid when returning.\n", + ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:3] -> [test.cpp:4]: (error) Using iterator that is a temporary.\n" + "[test.cpp:3] -> [test.cpp:4]: (error) Returning iterator that will be invalid when returning.\n", errout.str()); check("std::vector g();\n" diff --git a/test/testsymboldatabase.cpp b/test/testsymboldatabase.cpp index 4f11dc312..da9aa75a7 100644 --- a/test/testsymboldatabase.cpp +++ b/test/testsymboldatabase.cpp @@ -8451,6 +8451,19 @@ private: ASSERT_EQUALS(3, tok->variable()->valueType()->constness); ASSERT_EQUALS(1, tok->variable()->valueType()->pointer); } + { + GET_SYMBOL_DB("std::string f(const std::string& s) {\n" + " auto t = s.substr(3, 7);\n" + " auto r = t.substr(1, 2);\n" + " return r;\n" + "}\n"); + ASSERT_EQUALS("", errout.str()); + + const Token* tok = tokenizer.tokens(); + tok = Token::findsimplematch(tok, "auto r"); + ASSERT(tok && tok->valueType()); + ASSERT_EQUALS("container(std :: string|wstring|u16string|u32string)", tok->valueType()->str()); + } } void valueTypeThis() {