diff --git a/lib/checkunusedvar.cpp b/lib/checkunusedvar.cpp index 06493ca72..53c90d95f 100644 --- a/lib/checkunusedvar.cpp +++ b/lib/checkunusedvar.cpp @@ -427,9 +427,13 @@ static const Token* doAssignment(Variables &variables, const Token *tok, bool de } tok = tok->next(); - if (Token::Match(tok, "&| %var%") || - Token::Match(tok, "( const| struct|union| %type% *| ) &| %var%") || - Token::Match(tok, "( const| struct|union| %type% *| ) ( &| %var%") || + if (Token::Match(tok, "( const| struct|union| %type% * ) ( (")) + tok = tok->link()->next(); + + if (Token::Match(tok, "( [(<] const| struct|union| %type% *| [>)]")) + tok = tok->next(); + + if (Token::Match(tok, "(| &| %var%") || Token::Match(tok->next(), "< const| struct|union| %type% *| > ( &| %var%")) { bool addressOf = false; diff --git a/test/testunusedvar.cpp b/test/testunusedvar.cpp index c87d77e19..24f83577c 100644 --- a/test/testunusedvar.cpp +++ b/test/testunusedvar.cpp @@ -103,6 +103,7 @@ private: TEST_CASE(localvaralias9); // ticket #1996 TEST_CASE(localvaralias10); // ticket #2004 TEST_CASE(localvaralias11); // ticket #4423 - iterator + TEST_CASE(localvaralias12); // ticket #4394 TEST_CASE(localvarasm); TEST_CASE(localvarstatic); TEST_CASE(localvarextern); @@ -2727,6 +2728,15 @@ private: ASSERT_EQUALS("", errout.str()); } + void localvaralias12() { // #4394 + functionVariableUsage("void f(void) {\n" + " int a[4];\n" + " int *b = (int*)((int*)a+1);\n" + " x(b);\n" + "}"); + ASSERT_EQUALS("", errout.str()); + } + void localvarasm() { functionVariableUsage("void foo(int &b)\n" "{\n"