diff options
author | Friedemann Kleint <Friedemann.Kleint@qt.io> | 2020-03-18 15:47:30 +0100 |
---|---|---|
committer | Friedemann Kleint <Friedemann.Kleint@qt.io> | 2020-03-20 01:00:50 +0100 |
commit | 2e5cdd6bd8e99544fd9370900d30edda2c05c6f9 (patch) | |
tree | d832051067b428c4cd99872741e30c12e24e51b8 | |
parent | 719277aee248afe75abfac77414540827517ad3f (diff) |
shiboken: Fix classes with virtual destructors not being considered polymorphic
Previously, the polymorphic attribute was set in
AbstractMetaClass::addFunction() depending on hasVirtualDestructor().
This does not work when the destructor is the last function traversed.
Modify setHasVirtualDestructor() to set the hasVirtuals and
polymorphic attributes, too.
Fixes: PYSIDE-1246
Change-Id: If7b32a05110f96b5c4befde5f1d37475c9a5f240
Reviewed-by: Cristian Maureira-Fredes <cristian.maureira-fredes@qt.io>
4 files changed, 37 insertions, 5 deletions
diff --git a/sources/shiboken2/ApiExtractor/abstractmetalang.cpp b/sources/shiboken2/ApiExtractor/abstractmetalang.cpp index 0ce7df00a..ad694eb4f 100644 --- a/sources/shiboken2/ApiExtractor/abstractmetalang.cpp +++ b/sources/shiboken2/ApiExtractor/abstractmetalang.cpp @@ -1582,7 +1582,7 @@ void AbstractMetaClass::addFunction(AbstractMetaFunction *function) else Q_ASSERT(false); //memory leak - m_hasVirtuals |= function->isVirtual() || hasVirtualDestructor(); + m_hasVirtuals |= function->isVirtual(); m_isPolymorphic |= m_hasVirtuals; m_hasNonpublic |= !function->isPublic(); } @@ -2019,6 +2019,13 @@ void AbstractMetaClass::addDefaultCopyConstructor(bool isPrivate) addFunction(f); } +void AbstractMetaClass::setHasVirtualDestructor(bool value) +{ + m_hasVirtualDestructor = value; + if (value) + m_hasVirtuals = m_isPolymorphic = 1; +} + bool AbstractMetaClass::hasFunction(const AbstractMetaFunction *f) const { return functions_contains(m_functions, f); diff --git a/sources/shiboken2/ApiExtractor/abstractmetalang.h b/sources/shiboken2/ApiExtractor/abstractmetalang.h index 2ae1b6d21..166e7d0cb 100644 --- a/sources/shiboken2/ApiExtractor/abstractmetalang.h +++ b/sources/shiboken2/ApiExtractor/abstractmetalang.h @@ -1374,10 +1374,7 @@ public: return m_hasVirtualDestructor; } - void setHasVirtualDestructor(bool value) - { - m_hasVirtualDestructor = value; - } + void setHasVirtualDestructor(bool value); bool isConstructible() const { diff --git a/sources/shiboken2/ApiExtractor/tests/testabstractmetaclass.cpp b/sources/shiboken2/ApiExtractor/tests/testabstractmetaclass.cpp index b85a022b3..f2e15fdb0 100644 --- a/sources/shiboken2/ApiExtractor/tests/testabstractmetaclass.cpp +++ b/sources/shiboken2/ApiExtractor/tests/testabstractmetaclass.cpp @@ -195,6 +195,33 @@ public: QCOMPARE(funcC->implementingClass(), c); } +void TestAbstractMetaClass::testVirtualBase() +{ + const char cppCode[] =R"CPP( +class Base { +public: + virtual ~Base() = default; +}; +class Derived : public Base {}; +)CPP"; + + const char xmlCode[] = R"XML( +<typesystem package="Foo"> + <object-type name='Base'/> + <object-type name='Derived'/> +</typesystem> +)XML"; + QScopedPointer<AbstractMetaBuilder> builder(TestUtil::parse(cppCode, xmlCode)); + QVERIFY(!builder.isNull()); + AbstractMetaClassList classes = builder->classes(); + auto base = AbstractMetaClass::findClass(classes, QLatin1String("Base")); + QVERIFY(base); + QVERIFY(base->isPolymorphic()); + auto derived = AbstractMetaClass::findClass(classes, QLatin1String("Derived")); + QVERIFY(derived); + QVERIFY(derived->isPolymorphic()); +} + void TestAbstractMetaClass::testDefaultValues() { const char* cppCode ="\ diff --git a/sources/shiboken2/ApiExtractor/tests/testabstractmetaclass.h b/sources/shiboken2/ApiExtractor/tests/testabstractmetaclass.h index cb0b6693e..e19973625 100644 --- a/sources/shiboken2/ApiExtractor/tests/testabstractmetaclass.h +++ b/sources/shiboken2/ApiExtractor/tests/testabstractmetaclass.h @@ -40,6 +40,7 @@ private slots: void testClassName(); void testClassNameUnderNamespace(); void testVirtualMethods(); + void testVirtualBase(); void testDefaultValues(); void testModifiedDefaultValues(); void testInnerClassOfAPolymorphicOne(); |