diff --git a/lib/astutils.cpp b/lib/astutils.cpp index ae962fdb1..17e36d5f3 100644 --- a/lib/astutils.cpp +++ b/lib/astutils.cpp @@ -408,7 +408,7 @@ bool isVariableChangedByFunctionCall(const Token *tok, const Settings *settings, tok = tok ? tok->previous() : nullptr; if (tok && tok->link() && tok->str() == ">") tok = tok->link()->previous(); - if (!Token::Match(tok, "%name% (")) + if (!Token::Match(tok, "%name% [(<]")) return false; // not a function => variable not changed // Constructor call diff --git a/test/testastutils.cpp b/test/testastutils.cpp index 3151ed922..29fbba6a5 100644 --- a/test/testastutils.cpp +++ b/test/testastutils.cpp @@ -35,6 +35,7 @@ private: void run() { TEST_CASE(isReturnScope); TEST_CASE(isVariableChanged); + TEST_CASE(isVariableChangedByFunctionCall); } bool isReturnScope(const char code[], int offset) { @@ -74,6 +75,28 @@ private: " if (b) { (int)((INTOF(8))result >> b); }\n" "}", "if", "}")); } + + bool isVariableChangedByFunctionCall(const char code[], const char pattern[], bool *inconclusive) { + Settings settings; + Tokenizer tokenizer(&settings, this); + std::istringstream istr(code); + tokenizer.tokenize(istr, "test.cpp"); + const Token * const argtok = Token::findmatch(tokenizer.tokens(), pattern); + return ::isVariableChangedByFunctionCall(argtok, &settings, inconclusive); + } + + void isVariableChangedByFunctionCall() { + const char *code; + bool inconclusive; + + // #8271 - template method + code = "void f(int x) {\n" + " a(x);\n" + "}"; + inconclusive = false; + ASSERT_EQUALS(false, isVariableChangedByFunctionCall(code, "x ) ;", &inconclusive)); + ASSERT_EQUALS(true, inconclusive); + } }; REGISTER_TEST(TestAstUtils)