diff --git a/lib/checkuninitvar.cpp b/lib/checkuninitvar.cpp index 2cdc3e67f..86e0a73b8 100644 --- a/lib/checkuninitvar.cpp +++ b/lib/checkuninitvar.cpp @@ -430,7 +430,7 @@ private: // is there assignment or ternary operator in the return statement? bool assignment = false; for (const Token *tok2 = tok.next(); tok2 && tok2->str() != ";"; tok2 = tok2->next()) { - if (tok2->str() == "=" || tok2->str() == ">>" || tok2->str() == "?" || Token::Match(tok2, "(|, &")) { + if (tok2->str() == "=" || (!isC && tok2->str() == ">>") || tok2->str() == "?" || Token::Match(tok2, "(|, &")) { assignment = true; break; } diff --git a/test/testuninitvar.cpp b/test/testuninitvar.cpp index 99618b285..9cda7dbe4 100644 --- a/test/testuninitvar.cpp +++ b/test/testuninitvar.cpp @@ -222,11 +222,19 @@ private: "}\n"); ASSERT_EQUALS("", errout.str()); - checkUninitVar("static int foo() {\n" - " int ret;\n" - " return cin >> ret;\n" - "}\n"); - ASSERT_EQUALS("", errout.str()); + { + checkUninitVar("static int foo() {\n" + " int ret;\n" + " return cin >> ret;\n" + "}\n"); + ASSERT_EQUALS("", errout.str()); + + checkUninitVar("static int foo() {\n" + " int ret;\n" + " return cin >> ret;\n" + "}\n", "test.c"); + ASSERT_EQUALS("[test.c:3]: (error) Uninitialized variable: ret\n", errout.str()); + } checkUninitVar("void f()\n" "{\n"