From fe7d0eeffc6a01d14b7255aa1117f376baf300e7 Mon Sep 17 00:00:00 2001 From: chrchr-github <78114321+chrchr-github@users.noreply.github.com> Date: Fri, 25 Mar 2022 17:03:54 +0100 Subject: [PATCH] Fix #10919 FP: constStatement with template type (#3941) --- lib/checkother.cpp | 16 +++++++++++++++- test/testincompletestatement.cpp | 1 + 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/lib/checkother.cpp b/lib/checkother.cpp index 212a27128..48d6b24e0 100644 --- a/lib/checkother.cpp +++ b/lib/checkother.cpp @@ -1740,6 +1740,20 @@ static bool isVarDeclOp(const Token* tok) return isType(typetok, Token::Match(vartok, "%var%")); } +static bool isBracketAccess(const Token* tok) +{ + if (!Token::simpleMatch(tok, "[") || !tok->astOperand1()) + return false; + tok = tok->astOperand1(); + if (tok->str() == ".") + tok = tok->astOperand2(); + while (Token::simpleMatch(tok, "[")) + tok = tok->astOperand1(); + if (!tok || !tok->variable()) + return false; + return tok->variable()->nameToken() != tok; +} + static bool isConstStatement(const Token *tok, bool cpp) { if (!tok) @@ -1769,7 +1783,7 @@ static bool isConstStatement(const Token *tok, bool cpp) return tok->astParent() ? isConstStatement(tok->astOperand1(), cpp) && isConstStatement(tok->astOperand2(), cpp) : isConstStatement(tok->astOperand2(), cpp); if (Token::simpleMatch(tok, "?") && Token::simpleMatch(tok->astOperand2(), ":")) // ternary operator return isConstStatement(tok->astOperand1(), cpp) && isConstStatement(tok->astOperand2()->astOperand1(), cpp) && isConstStatement(tok->astOperand2()->astOperand2(), cpp); - if (Token::simpleMatch(tok, "[") && !Token::Match(tok->tokAt(-2), "%type% %name%") && isWithoutSideEffects(cpp, tok->astOperand1(), /*checkArrayAccess*/ true)) { + if (isBracketAccess(tok) && isWithoutSideEffects(cpp, tok->astOperand1(), /*checkArrayAccess*/ true)) { if (Token::simpleMatch(tok->astParent(), "[")) return isConstStatement(tok->astOperand2(), cpp) && isConstStatement(tok->astParent(), cpp); return isConstStatement(tok->astOperand2(), cpp); diff --git a/test/testincompletestatement.cpp b/test/testincompletestatement.cpp index 9fdc9da76..e251b7c5f 100644 --- a/test/testincompletestatement.cpp +++ b/test/testincompletestatement.cpp @@ -531,6 +531,7 @@ private: " j[0][0][h()];\n" " std::map M;\n" " M[\"abc\"];\n" + " std::auto_ptr app[4];" // #10919 "}\n"); ASSERT_EQUALS("", errout.str());