diff --git a/lib/valueflow.cpp b/lib/valueflow.cpp index 6ebf7a1c0..8ccb845b1 100644 --- a/lib/valueflow.cpp +++ b/lib/valueflow.cpp @@ -2840,7 +2840,7 @@ static void valueFlowLifetime(TokenList *tokenlist, SymbolDatabase*, ErrorLogger const Variable * var = getLifetimeVariable(tok, errorPath); if (!var) continue; - if (var->isArray() && !var->isArgument() && tok->astParent() && + if (var->isArray() && !var->isStlType() && !var->isArgument() && tok->astParent() && (astIsPointer(tok->astParent()) || Token::Match(tok->astParent(), "%assign%|return"))) { errorPath.emplace_back(tok, "Array decayed to pointer here."); diff --git a/test/testautovariables.cpp b/test/testautovariables.cpp index 3629bdcaa..b69a6d75d 100644 --- a/test/testautovariables.cpp +++ b/test/testautovariables.cpp @@ -1510,29 +1510,36 @@ private: "}\n"); ASSERT_EQUALS("", errout.str()); + <<<<<<< HEAD check("void f() {\n" " struct b {\n" " uint32_t f[6];\n" " } d;\n" " uint32_t *a = d.f;\n" - "}\n"); - ASSERT_EQUALS("", errout.str()); + ======= + // Dont decay std::array + check("std::array f() {\n" + " std::array x;\n" + " return x;\n" + >>>>>>> 52f00b8c88aecaa064f1acbebbe59331f08f09fc + "}\n"); + ASSERT_EQUALS("", errout.str()); - // Make sure we dont hang - check("struct A;\n" - "void f() {\n" - " using T = A[3];\n" - " A &&a = T{1, 2, 3}[1];\n" - "}\n"); - ASSERT_EQUALS("", errout.str()); + // Make sure we dont hang + check("struct A;\n" + "void f() {\n" + " using T = A[3];\n" + " A &&a = T{1, 2, 3}[1];\n" + "}\n"); + ASSERT_EQUALS("", errout.str()); - // Make sure we dont hang - check("struct A;\n" - "void f() {\n" - " using T = A[3];\n" - " A &&a = T{1, 2, 3}[1]();\n" - "}\n"); - ASSERT_EQUALS("", errout.str()); + // Make sure we dont hang + check("struct A;\n" + "void f() {\n" + " using T = A[3];\n" + " A &&a = T{1, 2, 3}[1]();\n" + "}\n"); + ASSERT_EQUALS("", errout.str()); } void danglingLifetimeFunction() {