From d9d23d979d7df693c75f77d857885fe3faf77d98 Mon Sep 17 00:00:00 2001 From: chrchr-github <78114321+chrchr-github@users.noreply.github.com> Date: Tue, 2 Jan 2024 13:33:22 +0100 Subject: [PATCH] Partial fix for #12302 internalAstError using lambda (#5816) --- lib/tokenlist.cpp | 6 +++++- test/testcppcheck.cpp | 4 ++-- test/testtokenize.cpp | 13 +++++++++++++ test/testuninitvar.cpp | 18 +++++++++++++++++- 4 files changed, 37 insertions(+), 4 deletions(-) diff --git a/lib/tokenlist.cpp b/lib/tokenlist.cpp index c37d81b88..1756d112b 100644 --- a/lib/tokenlist.cpp +++ b/lib/tokenlist.cpp @@ -573,8 +573,12 @@ static bool iscpp11init_impl(const Token * const tok) } auto isCaseStmt = [](const Token* colonTok) { - if (!Token::Match(colonTok->tokAt(-1), "%name%|%num%|%char% :")) + if (!Token::Match(colonTok->tokAt(-1), "%name%|%num%|%char%|) :")) return false; + if (const Token* castTok = colonTok->linkAt(-1)) { + if (Token::simpleMatch(castTok->astParent(), "case")) + return true; + } const Token* caseTok = colonTok->tokAt(-2); while (caseTok && Token::Match(caseTok->tokAt(-1), "::|%name%")) caseTok = caseTok->tokAt(-1); diff --git a/test/testcppcheck.cpp b/test/testcppcheck.cpp index 1932397c4..36ca8d59d 100644 --- a/test/testcppcheck.cpp +++ b/test/testcppcheck.cpp @@ -168,8 +168,8 @@ private: ASSERT_EQUALS(1, cppcheck.check(test_file_a.path())); ASSERT_EQUALS(1, cppcheck.check(test_file_b.path())); // TODO: how to properly disable these warnings? - errorLogger.errmsgs.erase(std::remove_if(errorLogger.errmsgs.begin(), errorLogger.errmsgs.end(), [](const ErrorMessage& errmsg) { - return errmsg.id == "logChecker"; + errorLogger.errmsgs.erase(std::remove_if(errorLogger.errmsgs.begin(), errorLogger.errmsgs.end(), [](const ErrorMessage& msg) { + return msg.id == "logChecker"; }), errorLogger.errmsgs.end()); // the internal errorlist is cleared after each check() call ASSERT_EQUALS(2, errorLogger.errmsgs.size()); diff --git a/test/testtokenize.cpp b/test/testtokenize.cpp index 245db59df..8dfaba260 100644 --- a/test/testtokenize.cpp +++ b/test/testtokenize.cpp @@ -6788,6 +6788,19 @@ private: " });\n" "}\n")); + ASSERT_NO_THROW(tokenizeAndStringify("struct A { A(int) {} };\n" + "void g(void (*)(int));\n" + "void f() {\n" + " g([](int i) {\n" + " switch (i) {\n" + " case static_cast(1): {\n" + " A a(i);\n" + " if (1) {}\n" + " }\n" + " }\n" + " });\n" + "}\n")); + // #11378 ASSERT_EQUALS("gT{(&[{= 0return", testAst("auto g = T{ [&]() noexcept -> int { return 0; } };")); diff --git a/test/testuninitvar.cpp b/test/testuninitvar.cpp index 238bea68e..39fad33b3 100644 --- a/test/testuninitvar.cpp +++ b/test/testuninitvar.cpp @@ -3735,7 +3735,7 @@ private: "}\n"); ASSERT_EQUALS("[test.cpp:5] -> [test.cpp:8]: (warning) Uninitialized variable: x\n", errout.str()); - valueFlowUninit("int do_something();\n" + valueFlowUninit("int do_something();\n" // #11983 "int set_st(int *x);\n" "int bar();\n" "void foo() {\n" @@ -3755,6 +3755,22 @@ private: " if(status == 1 && x > 0){}\n" "}\n"); ASSERT_EQUALS("", errout.str()); + + valueFlowUninit("int h(bool, bool*);\n" // #11760 + "int f(bool t) {\n" + " int i = 0;\n" + " bool b;\n" + " if (t)\n" + " g();\n" + " if (i == 0)\n" + " i = h(t, &b);\n" + " if (i == 0 && b)\n" + " i = h(t, &b);\n" + " if (i == 0 && b)\n" + " i = h(t, &b);\n" + " return i;\n" + "}\n"); + ASSERT_EQUALS("", errout.str()); } void valueFlowUninit_uninitvar2()