diff --git a/lib/valueflow.cpp b/lib/valueflow.cpp index 7d75d2841..5252139ce 100644 --- a/lib/valueflow.cpp +++ b/lib/valueflow.cpp @@ -7424,6 +7424,8 @@ static bool needsInitialization(const Variable* var, bool cpp) { if (!var) return false; + if (var->hasDefault()) + return false; if (var->isPointer()) return true; if (var->type() && var->type()->isUnionType()) diff --git a/test/testuninitvar.cpp b/test/testuninitvar.cpp index 87dcdb0b6..5d4b6ad79 100644 --- a/test/testuninitvar.cpp +++ b/test/testuninitvar.cpp @@ -6127,7 +6127,7 @@ private: " int a = ab.a;\n" " int b = ab.b;\n" "}"); - ASSERT_EQUALS("[test.cpp:4]: (error) Uninitialized variable: ab.a\n", errout.str()); + TODO_ASSERT_EQUALS("[test.cpp:5]: (error) Uninitialized variable: ab.b\n", "", errout.str()); // STL class member valueFlowUninit("struct A {\n" @@ -6227,6 +6227,17 @@ private: "}\n"); ASSERT_EQUALS("[test.cpp:4]: (error) Uninitialized variable: s\n", errout.str()); + + valueFlowUninit("struct S {\n" // #11321 + " int a = 0;\n" + " int b;\n" + "};\n" + "void f() {\n" + " S s1;\n" + " s1.b = 1;\n" + " S s2 = s1;\n" + "}\n"); + ASSERT_EQUALS("", errout.str()); } void uninitvar_memberfunction() {