From 74088f0ea1ed1e6a63db5581efb607d3d1f528b2 Mon Sep 17 00:00:00 2001 From: chrchr-github <78114321+chrchr-github@users.noreply.github.com> Date: Thu, 11 Apr 2024 14:37:07 +0200 Subject: [PATCH 1/4] Update checkclass.cpp --- lib/checkclass.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib/checkclass.cpp b/lib/checkclass.cpp index 1a42f8ab820..cbf21898579 100644 --- a/lib/checkclass.cpp +++ b/lib/checkclass.cpp @@ -3327,6 +3327,8 @@ void CheckClass::checkReturnByReference() for (const Function& func : classScope->functionList) { if (Function::returnsPointer(&func) || Function::returnsReference(&func) || Function::returnsStandardType(&func)) continue; + if (func.isImplicitlyVirtual()) + continue; if (const Variable* var = getSingleReturnVar(func.functionScope)) { if (!var->valueType()) continue; From 754b0070c03ae91554ef2610ee65310fdeecdbb5 Mon Sep 17 00:00:00 2001 From: chrchr-github <78114321+chrchr-github@users.noreply.github.com> Date: Thu, 11 Apr 2024 14:38:23 +0200 Subject: [PATCH 2/4] Update testclass.cpp --- test/testclass.cpp | 34 +++++++++++++++++++++------------- 1 file changed, 21 insertions(+), 13 deletions(-) diff --git a/test/testclass.cpp b/test/testclass.cpp index 4d62db1eadb..a0e52a94bcf 100644 --- a/test/testclass.cpp +++ b/test/testclass.cpp @@ -8960,21 +8960,29 @@ class TestClass : public TestFixture { } void returnByReference() { - checkReturnByReference("struct T { int a[10]; };" // #12546 - "struct S {" - " T t;" - " int i;" - " std::string s;" - " T getT() const { return t; }" - " int getI() const { return i; }" - " std::string getS() const { return s; }" - " unknown_t f() { return; }" - "};"); - ASSERT_EQUALS("[test.cpp:1]: (performance) Function 'getT()' should return member 't' by const reference.\n" - "[test.cpp:1]: (performance) Function 'getS()' should return member 's' by const reference.\n", + checkReturnByReference("struct T { int a[10]; };\n" // #12546 + "struct S {\n" + " T t;\n" + " int i;\n" + " std::string s;\n" + " T getT() const { return t; }\n" + " int getI() const { return i; }\n" + " std::string getS() const { return s; }\n" + " unknown_t f() { return; }\n" + "};\n"); + ASSERT_EQUALS("[test.cpp:6]: (performance) Function 'getT()' should return member 't' by const reference.\n" + "[test.cpp:8]: (performance) Function 'getS()' should return member 's' by const reference.\n", errout_str()); - } + checkReturnByReference("struct B {\n" // #12608 + " virtual std::string f() { return \"abc\"; }\n" + "};\n" + "struct D : B {\n" + " std::string f() override { return s; }\n" + " std::string s;\n" + "}"); + ASSERT_EQUALS("", errout_str()); + } }; REGISTER_TEST(TestClass) From 7adfb08f31ee3b4487850b2182263762166414b7 Mon Sep 17 00:00:00 2001 From: chrchr-github <78114321+chrchr-github@users.noreply.github.com> Date: Thu, 11 Apr 2024 15:13:07 +0200 Subject: [PATCH 3/4] Update checkclass.cpp --- lib/checkclass.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib/checkclass.cpp b/lib/checkclass.cpp index cbf21898579..2961873de26 100644 --- a/lib/checkclass.cpp +++ b/lib/checkclass.cpp @@ -3332,6 +3332,8 @@ void CheckClass::checkReturnByReference() if (const Variable* var = getSingleReturnVar(func.functionScope)) { if (!var->valueType()) continue; + if (var->isArgument()) + continue; const bool isContainer = var->valueType()->type == ValueType::Type::CONTAINER && var->valueType()->container; const bool isView = isContainer && var->valueType()->container->view; bool warn = isContainer && !isView; From 7bfb95cc1079b14e5b8fb41bf83f8ccacab98411 Mon Sep 17 00:00:00 2001 From: chrchr-github <78114321+chrchr-github@users.noreply.github.com> Date: Thu, 11 Apr 2024 15:15:20 +0200 Subject: [PATCH 4/4] Update testclass.cpp --- test/testclass.cpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/test/testclass.cpp b/test/testclass.cpp index a0e52a94bcf..b0ffbb6b550 100644 --- a/test/testclass.cpp +++ b/test/testclass.cpp @@ -8980,7 +8980,12 @@ class TestClass : public TestFixture { "struct D : B {\n" " std::string f() override { return s; }\n" " std::string s;\n" - "}"); + "};\n"); + ASSERT_EQUALS("", errout_str()); + + checkReturnByReference("struct S {\n" + " std::string f(std::string s) { return s; }\n" + "};\n"); ASSERT_EQUALS("", errout_str()); } };