diff --git a/lib/checkclass.cpp b/lib/checkclass.cpp index 6b4eb7da9..b699a42c6 100644 --- a/lib/checkclass.cpp +++ b/lib/checkclass.cpp @@ -697,7 +697,7 @@ void CheckClass::assignAllVarsVisibleFromScope(std::vector& usageList, co for (const Type::BaseInfo& i : scope->definedType->derivedFrom) { const Type *derivedFrom = i.type; - if (derivedFrom) + if (derivedFrom && derivedFrom->classScope) assignAllVarsVisibleFromScope(usageList, derivedFrom->classScope); } } diff --git a/test/testconstructors.cpp b/test/testconstructors.cpp index e49a66ce2..6f5ef7f20 100644 --- a/test/testconstructors.cpp +++ b/test/testconstructors.cpp @@ -1440,7 +1440,7 @@ private: "[test.cpp:9]: (warning) Member variable 'B::ca' is not assigned a value in 'B::operator='.\n", errout.str()); - check("class C : B {\n" + check("class C : B {\n" // don't crash " virtual C& operator=(C& c);\n" "};\n" "class D : public C {\n" @@ -1448,6 +1448,16 @@ private: "};\n"); ASSERT_EQUALS("", errout.str()); + check("struct B;\n" // don't crash + "struct D : B { D& operator=(const D&); };\n" + "struct E : D { E& operator=(const E& rhs); };\n" + "E& E::operator=(const E& rhs) {\n" + " if (this != &rhs)\n" + " D::operator=(rhs);\n" + " return *this;\n" + "}\n"); + ASSERT_EQUALS("", errout.str()); + } void initvar_derived_pod_struct_with_union() {