From f96faa32877304487e66fbe5783e4589e09a1dda Mon Sep 17 00:00:00 2001 From: chrchr Date: Wed, 5 Jan 2022 17:47:12 +0100 Subject: [PATCH 1/3] Fix #10469 FP returnTempReference with overloaded operator+= --- lib/symboldatabase.cpp | 9 ++++++++- test/testautovariables.cpp | 12 ++++++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/lib/symboldatabase.cpp b/lib/symboldatabase.cpp index 7b769ff58ee..8fb30457847 100644 --- a/lib/symboldatabase.cpp +++ b/lib/symboldatabase.cpp @@ -7089,7 +7089,14 @@ ValueType::MatchResult ValueType::matchParameter(const ValueType *call, const Va ValueType::MatchResult ValueType::matchParameter(const ValueType *call, const Variable *callVar, const Variable *funcVar) { - ValueType::MatchResult res = ValueType::matchParameter(call, funcVar->valueType()); + ValueType vt; + auto pvt = funcVar->valueType(); + if (pvt && funcVar->isArray()) { + vt = *pvt; + ++vt.pointer; + pvt = &vt; + } + ValueType::MatchResult res = ValueType::matchParameter(call, pvt); if (callVar && ((res == ValueType::MatchResult::SAME && call->container) || res == ValueType::MatchResult::UNKNOWN)) { const std::string type1 = getTypeString(callVar->typeStartToken()); const std::string type2 = getTypeString(funcVar->typeStartToken()); diff --git a/test/testautovariables.cpp b/test/testautovariables.cpp index 5d362eb766c..0652e9c0b21 100644 --- a/test/testautovariables.cpp +++ b/test/testautovariables.cpp @@ -3295,6 +3295,18 @@ class TestAutoVariables : public TestFixture { "}\n"); ASSERT_EQUALS("[test.cpp:9] -> [test.cpp:9] -> [test.cpp:10]: (error) Using iterator that is a temporary.\n", errout.str()); + + check("struct String {\n" // #10469 + " void Append(uint8_t Val);\n" + " String& operator+=(const char s[]);\n" + " String & operator+=(const std::string& Str) {\n" + " return operator+=(Str.c_str());\n" + " }\n" + " void operator+=(uint8_t Val) {\n" + " Append(Val);\n" + " }\n" + "};\n"); + ASSERT_EQUALS("", errout.str()); } void danglingLifetimeBorrowedMembers() From c04bc2a56e64907ba0311893455dfda2febfe49c Mon Sep 17 00:00:00 2001 From: chrchr Date: Wed, 5 Jan 2022 18:39:27 +0100 Subject: [PATCH 2/3] Format --- test/testautovariables.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/testautovariables.cpp b/test/testautovariables.cpp index 0652e9c0b21..54aefb6de49 100644 --- a/test/testautovariables.cpp +++ b/test/testautovariables.cpp @@ -3299,7 +3299,7 @@ class TestAutoVariables : public TestFixture { check("struct String {\n" // #10469 " void Append(uint8_t Val);\n" " String& operator+=(const char s[]);\n" - " String & operator+=(const std::string& Str) {\n" + " String& operator+=(const std::string& Str) {\n" " return operator+=(Str.c_str());\n" " }\n" " void operator+=(uint8_t Val) {\n" From d157003f6026168ba2f6d40e09e7707086ff7de6 Mon Sep 17 00:00:00 2001 From: chrchr Date: Wed, 5 Jan 2022 19:27:08 +0100 Subject: [PATCH 3/3] clang-tidy --- lib/symboldatabase.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/symboldatabase.cpp b/lib/symboldatabase.cpp index 8fb30457847..df40628db42 100644 --- a/lib/symboldatabase.cpp +++ b/lib/symboldatabase.cpp @@ -7090,7 +7090,7 @@ ValueType::MatchResult ValueType::matchParameter(const ValueType *call, const Va ValueType::MatchResult ValueType::matchParameter(const ValueType *call, const Variable *callVar, const Variable *funcVar) { ValueType vt; - auto pvt = funcVar->valueType(); + const ValueType* pvt = funcVar->valueType(); if (pvt && funcVar->isArray()) { vt = *pvt; ++vt.pointer;