From d9c55e9614fa6c15afa95f53846e62f3149e6b79 Mon Sep 17 00:00:00 2001 From: chrchr-github Date: Fri, 3 Apr 2026 20:17:33 +0200 Subject: [PATCH 1/3] Fix #12548 FN returnTempReference with braced initializer (regression) --- lib/astutils.cpp | 5 +---- test/testautovariables.cpp | 9 +++++++++ 2 files changed, 10 insertions(+), 4 deletions(-) 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..b95a7431de2 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,14 @@ class TestAutoVariables : public TestFixture { ASSERT_EQUALS("", errout_str()); } + void returnReference29() + { + check("const std::string& s() {\n" // #12548 + " return std::string{};\n" + "}\n"); + ASSERT_EQUALS("[test.cpp:2:23]: (error) Reference to temporary returned. [returnTempReference]\n", errout_str()); + } + void returnReferenceFunction() { check("int& f(int& a) {\n" " return a;\n" From aa643b2a1396c5a1f0dca1e66f234d24d9cfb283 Mon Sep 17 00:00:00 2001 From: chrchr-github Date: Sat, 4 Apr 2026 10:32:18 +0200 Subject: [PATCH 2/3] Add test --- test/testautovariables.cpp | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/test/testautovariables.cpp b/test/testautovariables.cpp index b95a7431de2..2020bbdb5e8 100644 --- a/test/testautovariables.cpp +++ b/test/testautovariables.cpp @@ -1760,10 +1760,15 @@ class TestAutoVariables : public TestFixture { void returnReference29() { - check("const std::string& s() {\n" // #12548 + check("const std::string& f() {\n" // #12548 " return std::string{};\n" + "}\n" + "const std::string& g() {\n" // #12548 + " return {};\n" "}\n"); - ASSERT_EQUALS("[test.cpp:2:23]: (error) Reference to temporary returned. [returnTempReference]\n", errout_str()); + 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() { From 9f65c38dc946271861132c665339845b89fdcefd Mon Sep 17 00:00:00 2001 From: chrchr-github <78114321+chrchr-github@users.noreply.github.com> Date: Sat, 4 Apr 2026 10:38:06 +0200 Subject: [PATCH 3/3] Undo [skip ci] --- test/testautovariables.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/testautovariables.cpp b/test/testautovariables.cpp index 2020bbdb5e8..f4e3b861a43 100644 --- a/test/testautovariables.cpp +++ b/test/testautovariables.cpp @@ -1763,7 +1763,7 @@ class TestAutoVariables : public TestFixture { check("const std::string& f() {\n" // #12548 " return std::string{};\n" "}\n" - "const std::string& g() {\n" // #12548 + "const std::string& g() {\n" " return {};\n" "}\n"); ASSERT_EQUALS("[test.cpp:2:23]: (error) Reference to temporary returned. [returnTempReference]\n"