diff --git a/lib/astutils.cpp b/lib/astutils.cpp index f16144310ac..59e7bc62183 100644 --- a/lib/astutils.cpp +++ b/lib/astutils.cpp @@ -461,7 +461,7 @@ bool isTemporary(const Token* tok, const Library* library, bool unknown) return false; return !branchTok->astOperand1()->valueType()->isTypeEqual(branchTok->astOperand2()->valueType()); } - if (Token::simpleMatch(tok, "(") && tok->astOperand1() && + if (Token::Match(tok, "(|{") && tok->astOperand1() && (tok->astOperand2() || Token::simpleMatch(tok->next(), ")"))) { if (Token::simpleMatch(tok->astOperand1(), "typeid")) return false; @@ -498,9 +498,6 @@ bool isTemporary(const Token* tok, const Library* library, bool unknown) // Currying a function is unknown in cppcheck if (Token::simpleMatch(tok, "(") && Token::simpleMatch(tok->astOperand1(), "(")) return unknown; - if (Token::simpleMatch(tok, "{") && Token::simpleMatch(tok->astParent(), "return") && tok->astOperand1() && - !tok->astOperand2()) - return isTemporary(tok->astOperand1(), library); return true; } diff --git a/test/testautovariables.cpp b/test/testautovariables.cpp index bcdba7ca0dc..f4e3b861a43 100644 --- a/test/testautovariables.cpp +++ b/test/testautovariables.cpp @@ -131,6 +131,7 @@ class TestAutoVariables : public TestFixture { TEST_CASE(returnReference26); TEST_CASE(returnReference27); TEST_CASE(returnReference28); + TEST_CASE(returnReference29); TEST_CASE(returnReferenceFunction); TEST_CASE(returnReferenceContainer); TEST_CASE(returnReferenceLiteral); @@ -1757,6 +1758,19 @@ class TestAutoVariables : public TestFixture { ASSERT_EQUALS("", errout_str()); } + void returnReference29() + { + check("const std::string& f() {\n" // #12548 + " return std::string{};\n" + "}\n" + "const std::string& g() {\n" + " return {};\n" + "}\n"); + ASSERT_EQUALS("[test.cpp:2:23]: (error) Reference to temporary returned. [returnTempReference]\n" + "[test.cpp:5:12]: (error) Reference to temporary returned. [returnTempReference]\n", + errout_str()); + } + void returnReferenceFunction() { check("int& f(int& a) {\n" " return a;\n"