diff --git a/lib/checkuninitvar.cpp b/lib/checkuninitvar.cpp index b7095459a..f31da168e 100644 --- a/lib/checkuninitvar.cpp +++ b/lib/checkuninitvar.cpp @@ -1603,6 +1603,10 @@ bool CheckUninitVar::isVariableUsage(const Token *vartok, bool pointer, bool cpp if (vartok->previous()->str() == "return") return true; + // Passing variable to typeof/__alignof__ + if (Token::Match(vartok->tokAt(-3), "typeof|__alignof__ ( * %var%")) + return false; + // Passing variable to function.. if (Token::Match(vartok->previous(), "[(,] %var% [,)]") || Token::Match(vartok->tokAt(-2), "[(,] & %var% [,)]")) { const bool address(vartok->previous()->str() == "&"); diff --git a/test/testuninitvar.cpp b/test/testuninitvar.cpp index f58617c9b..17cb06199 100644 --- a/test/testuninitvar.cpp +++ b/test/testuninitvar.cpp @@ -1963,6 +1963,12 @@ private: " TYPEOF(s->status);\n" "}"); ASSERT_EQUALS("", errout.str()); + + checkUninitVar("void f() {\n" + " #define w(x) ({ x z; (x*)z; })\n" + " int *n = w(typeof(*n));\n" + "}"); + ASSERT_EQUALS("", errout.str()); }