From f5a94ed3009495f77e2c8a15d1f5184fce783508 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Marjam=C3=A4ki?= Date: Tue, 4 Dec 2018 18:46:00 +0100 Subject: [PATCH] ValueFlow: Fix FP when lambda is called --- lib/valueflow.cpp | 6 +++--- test/testvalueflow.cpp | 10 ++++++++++ 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/lib/valueflow.cpp b/lib/valueflow.cpp index 87dae7d85..0b8deffc7 100644 --- a/lib/valueflow.cpp +++ b/lib/valueflow.cpp @@ -1880,10 +1880,10 @@ static bool valueFlowForward(Token * const startToken, // skip lambda functions // TODO: handle lambda functions - if (Token::simpleMatch(tok2, "= [")) { - Token *lambdaEndToken = const_cast(findLambdaEndToken(tok2->next())); + if (tok2->str() == "[" && findLambdaEndToken(tok2)) { + Token *lambdaEndToken = const_cast(findLambdaEndToken(tok2)); // Dont skip lambdas for lifetime values - if (lambdaEndToken && !std::all_of(values.begin(), values.end(), std::mem_fn(&ValueFlow::Value::isLifetimeValue))) { + if (!std::all_of(values.begin(), values.end(), std::mem_fn(&ValueFlow::Value::isLifetimeValue))) { tok2 = lambdaEndToken; continue; } diff --git a/test/testvalueflow.cpp b/test/testvalueflow.cpp index 3bb661d74..37b3c6ff7 100644 --- a/test/testvalueflow.cpp +++ b/test/testvalueflow.cpp @@ -1431,6 +1431,16 @@ private: "}\n"; ASSERT_EQUALS(false, testValueOfX(code, 4U, 0)); + code = "void f() {\n" + " int x = 0;\n" + " dostuff([&]() {\n" + " if (x > 0) {}\n" + " x++;\n" + " });\n" + " dosomething(q);\n" + "}\n"; + ASSERT_EQUALS(false, testValueOfX(code, 4U, 0)); + // ?: code = "void f() {\n" " int x = 8;\n"