diff --git a/lib/symboldatabase.cpp b/lib/symboldatabase.cpp index a93b4a717..8eda70a45 100644 --- a/lib/symboldatabase.cpp +++ b/lib/symboldatabase.cpp @@ -2279,6 +2279,9 @@ bool Function::returnsReference(const Function* function, bool unknown) start = start->next(); if (start->tokAt(1) == defEnd && !start->type() && !start->isStandardType()) return unknown; + // TODO: Try to deduce the type of the expression + if (Token::Match(start, "decltype|typeof")) + return unknown; return false; } diff --git a/test/testautovariables.cpp b/test/testautovariables.cpp index 804919ee2..ebc1897c2 100644 --- a/test/testautovariables.cpp +++ b/test/testautovariables.cpp @@ -112,6 +112,7 @@ private: TEST_CASE(returnReference16); // #9433 TEST_CASE(returnReference16); // #9433 TEST_CASE(returnReference17); // #9461 + TEST_CASE(returnReference18); // #9482 TEST_CASE(returnReferenceFunction); TEST_CASE(returnReferenceContainer); TEST_CASE(returnReferenceLiteral); @@ -1297,6 +1298,15 @@ private: ASSERT_EQUALS("", errout.str()); } + void returnReference18() { + check("template\n" + "auto f(T& x) -> decltype(x);\n" + "int& g(int* x) {\n" + " return f(*x);\n" + "}\n"); + ASSERT_EQUALS("", errout.str()); + } + void returnReferenceFunction() { check("int& f(int& a) {\n" " return a;\n"