diff --git a/lib/astutils.cpp b/lib/astutils.cpp index 5a0f6b213..b1c8b862b 100644 --- a/lib/astutils.cpp +++ b/lib/astutils.cpp @@ -371,6 +371,8 @@ bool isTemporary(bool cpp, const Token* tok, const Library* library, bool unknow return false; if (const Function * f = ftok->function()) { return !Function::returnsReference(f, true); + } else if (ftok->type()) { + return true; } else if (library) { std::string returnType = library->returnValueType(ftok); return !returnType.empty() && returnType.back() != '&'; diff --git a/test/testautovariables.cpp b/test/testautovariables.cpp index 708525bcb..2e931a8f8 100644 --- a/test/testautovariables.cpp +++ b/test/testautovariables.cpp @@ -118,6 +118,7 @@ private: TEST_CASE(returnReference21); // #9530 TEST_CASE(returnReference22); TEST_CASE(returnReference23); + TEST_CASE(returnReference24); // #10098 TEST_CASE(returnReferenceFunction); TEST_CASE(returnReferenceContainer); TEST_CASE(returnReferenceLiteral); @@ -1462,6 +1463,17 @@ private: ASSERT_EQUALS("", errout.str()); } + void returnReference24() + { + check("struct A {\n" + " A() {}\n" + "};\n" + "const A& a() {\n" + " return A();\n" + "}\n"); + ASSERT_EQUALS("[test.cpp:5]: (error) Reference to temporary returned.\n", errout.str()); + } + void returnReferenceFunction() { check("int& f(int& a) {\n" " return a;\n"