aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFriedemann Kleint <Friedemann.Kleint@qt.io>2020-03-18 15:47:30 +0100
committerFriedemann Kleint <Friedemann.Kleint@qt.io>2020-03-20 01:00:50 +0100
commit2e5cdd6bd8e99544fd9370900d30edda2c05c6f9 (patch)
treed832051067b428c4cd99872741e30c12e24e51b8
parent719277aee248afe75abfac77414540827517ad3f (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>
-rw-r--r--sources/shiboken2/ApiExtractor/abstractmetalang.cpp9
-rw-r--r--sources/shiboken2/ApiExtractor/abstractmetalang.h5
-rw-r--r--sources/shiboken2/ApiExtractor/tests/testabstractmetaclass.cpp27
-rw-r--r--sources/shiboken2/ApiExtractor/tests/testabstractmetaclass.h1
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();