diff --git a/lib/astutils.cpp b/lib/astutils.cpp index 3844333e64f..f2f8c495b67 100644 --- a/lib/astutils.cpp +++ b/lib/astutils.cpp @@ -724,7 +724,7 @@ std::vector getParentValueTypes(const Token* tok, const Settings* set const Scope* scope = t->classScope; // Check for aggregate constructors if (scope && scope->numConstructors == 0 && t->derivedFrom.empty() && - (t->isClassType() || t->isStructType()) && numberOfArguments(ftok) < scope->varlist.size()) { + (t->isClassType() || t->isStructType()) && numberOfArguments(ftok) <= scope->varlist.size() && !scope->varlist.empty()) { assert(argn < scope->varlist.size()); auto it = std::next(scope->varlist.cbegin(), argn); if (it->valueType()) diff --git a/lib/valueflow.cpp b/lib/valueflow.cpp index a63062862ad..0f34206de59 100644 --- a/lib/valueflow.cpp +++ b/lib/valueflow.cpp @@ -4602,7 +4602,7 @@ static void valueFlowLifetimeClassConstructor(Token* tok, const Variable& var = *it; if (var.isReference() || var.isRValueReference()) { ls.byRef(tok, tokenlist, errorLogger, settings); - } else { + } else if (ValueFlow::isLifetimeBorrowed(ls.argtok, settings)) { ls.byVal(tok, tokenlist, errorLogger, settings); } it++; diff --git a/test/testautovariables.cpp b/test/testautovariables.cpp index aed96118ca5..2978f54ddb3 100644 --- a/test/testautovariables.cpp +++ b/test/testautovariables.cpp @@ -3750,6 +3750,15 @@ class TestAutoVariables : public TestFixture { " return A{y, x};\n" "}"); ASSERT_EQUALS("", errout.str()); + + check("struct a {\n" + " std::string m;\n" + "};\n" + "a f() {\n" + " std::array m {};\n" + " return { m.data() };\n" + "}\n"); + ASSERT_EQUALS("", errout.str()); } void danglingLifetimeInitList() {