diff options
author | Andreas Beckermann <beckermann@monument-software.de> | 2019-10-17 08:49:52 +0200 |
---|---|---|
committer | Andreas Beckermann <beckermann@monument-software.de> | 2019-10-25 09:43:53 +0200 |
commit | e940872c12399e8fc5c33ed2e52a719373bc03cf (patch) | |
tree | 775977a15a7f4807c972ecdc40fc94806c45eae3 /sources/shiboken2/ApiExtractor/abstractmetabuilder.cpp | |
parent | 28fa0a6baba7a79ce85f8d62c2c296aa9f98de4c (diff) |
Fix hasVirtualDestructor() for implicit destructors
If a derived class does not declare an explicit destructor,
AbstractMetaClass::hasVirtualDestructor() is set to false.
However this is incorrect for classes that have a base class that in
turn provide a virtual destructor.
Consequently shiboken generates incorrect code in cases where it depends
on that value (e.g. for methods that override ownership of the returned
object - instead of releasing ownership, shiboken invalidates it).
This patch considers the baseClass()->hasVirtualDestructor() after
traversing all functions (which checks for explicit destructors).
Change-Id: Ifc4a472290d835dd6ef7d702b912643c9a2b42da
Reviewed-by: Friedemann Kleint <Friedemann.Kleint@qt.io>
Diffstat (limited to 'sources/shiboken2/ApiExtractor/abstractmetabuilder.cpp')
-rw-r--r-- | sources/shiboken2/ApiExtractor/abstractmetabuilder.cpp | 6 |
1 files changed, 5 insertions, 1 deletions
diff --git a/sources/shiboken2/ApiExtractor/abstractmetabuilder.cpp b/sources/shiboken2/ApiExtractor/abstractmetabuilder.cpp index 6aafe68be..84721968d 100644 --- a/sources/shiboken2/ApiExtractor/abstractmetabuilder.cpp +++ b/sources/shiboken2/ApiExtractor/abstractmetabuilder.cpp @@ -512,8 +512,12 @@ void AbstractMetaBuilderPrivate::traverseDom(const FileModelItem &dom) ReportHandler::startProgress("Fixing class inheritance..."); for (AbstractMetaClass *cls : qAsConst(m_metaClasses)) { - if (!cls->isInterface() && !cls->isNamespace()) + if (!cls->isInterface() && !cls->isNamespace()) { setupInheritance(cls); + if (!cls->hasVirtualDestructor() && cls->baseClass() + && cls->baseClass()->hasVirtualDestructor()) + cls->setHasVirtualDestructor(true); + } } ReportHandler::startProgress("Detecting inconsistencies in class model..."); |