diff options
author | Friedemann Kleint <Friedemann.Kleint@qt.io> | 2022-01-17 13:15:15 +0100 |
---|---|---|
committer | Friedemann Kleint <Friedemann.Kleint@qt.io> | 2022-01-18 16:33:25 +0100 |
commit | ef2223f3d712e5f66c4654f7bce2011869ef958a (patch) | |
tree | 4e1c7bdfebb81d6afa4b7380fe9c2d32ac0141f1 | |
parent | c1e64f5e5583ba6e9e36bf54327747018a2541bc (diff) |
shiboken6: Fix handling of value types with protected constructors
Value types with some protected constructors (like
QOperatingSystemVersionBase in 6.3) caused compile errors on Windows
where the protected hack is disabled since non-accessible constructors
were used.
The check for isValueTypeWithCopyConstructorOnly() needs to be fixed
to exclude protected constructors in case AvoidProtectedHack is set.
Similarly, the visibility of the minimal default constructor needs to
be checked. Add the AvoidProtectedHack setting to ApiExtractorResult
for this purpose since it influences the API in a way.
Pick-to: 6.2
Change-Id: Ifeab320b9391aa21c5b1de4d21d2d8276fe44d3f
Reviewed-by: Christian Tismer <tismer@stackless.com>
6 files changed, 17 insertions, 4 deletions
diff --git a/sources/shiboken6/ApiExtractor/abstractmetabuilder.cpp b/sources/shiboken6/ApiExtractor/abstractmetabuilder.cpp index 0ad32fec1..178878a0d 100644 --- a/sources/shiboken6/ApiExtractor/abstractmetabuilder.cpp +++ b/sources/shiboken6/ApiExtractor/abstractmetabuilder.cpp @@ -546,7 +546,9 @@ void AbstractMetaBuilderPrivate::traverseDom(const FileModelItem &dom, if (cls->canAddDefaultCopyConstructor()) cls->addDefaultCopyConstructor(); - const bool vco = AbstractMetaClass::determineValueTypeWithCopyConstructorOnly(cls); + const bool avoidProtectedHack = flags.testFlag(ApiExtractorFlag::AvoidProtectedHack); + const bool vco = + AbstractMetaClass::determineValueTypeWithCopyConstructorOnly(cls, avoidProtectedHack); cls->setValueTypeWithCopyConstructorOnly(vco); cls->typeEntry()->setValueTypeWithCopyConstructorOnly(vco); } diff --git a/sources/shiboken6/ApiExtractor/abstractmetalang.cpp b/sources/shiboken6/ApiExtractor/abstractmetalang.cpp index 79a071de6..22f9f7ae4 100644 --- a/sources/shiboken6/ApiExtractor/abstractmetalang.cpp +++ b/sources/shiboken6/ApiExtractor/abstractmetalang.cpp @@ -1800,7 +1800,8 @@ void AbstractMetaClass::setValueTypeWithCopyConstructorOnly(bool v) d->m_valueTypeWithCopyConstructorOnly = v; } -bool AbstractMetaClass::determineValueTypeWithCopyConstructorOnly(const AbstractMetaClass *c) +bool AbstractMetaClass::determineValueTypeWithCopyConstructorOnly(const AbstractMetaClass *c, + bool avoidProtectedHack) { if (!c->typeEntry()->isValue()) @@ -1812,7 +1813,8 @@ bool AbstractMetaClass::determineValueTypeWithCopyConstructorOnly(const Abstract for (const auto &ctor : ctors) { switch (ctor->functionType()) { case AbstractMetaFunction::ConstructorFunction: - return false; + if (!ctor->isPrivate() && (ctor->isPublic() || !avoidProtectedHack)) + return false; case AbstractMetaFunction::CopyConstructorFunction: copyConstructorFound = true; break; diff --git a/sources/shiboken6/ApiExtractor/abstractmetalang.h b/sources/shiboken6/ApiExtractor/abstractmetalang.h index 555b7158f..df978f598 100644 --- a/sources/shiboken6/ApiExtractor/abstractmetalang.h +++ b/sources/shiboken6/ApiExtractor/abstractmetalang.h @@ -349,7 +349,8 @@ public: bool isCopyable() const; bool isValueTypeWithCopyConstructorOnly() const; void setValueTypeWithCopyConstructorOnly(bool v); - static bool determineValueTypeWithCopyConstructorOnly(const AbstractMetaClass *c); + static bool determineValueTypeWithCopyConstructorOnly(const AbstractMetaClass *c, + bool avoidProtectedHack); static AbstractMetaClass *findClass(const AbstractMetaClassList &classes, const QString &name); diff --git a/sources/shiboken6/ApiExtractor/apiextractor.cpp b/sources/shiboken6/ApiExtractor/apiextractor.cpp index 2535b0746..6b171e5d5 100644 --- a/sources/shiboken6/ApiExtractor/apiextractor.cpp +++ b/sources/shiboken6/ApiExtractor/apiextractor.cpp @@ -259,6 +259,7 @@ std::optional<ApiExtractorResult> ApiExtractor::run(ApiExtractorFlags flags) result.m_globalFunctions = m_builder->globalFunctions(); result.m_globalEnums = m_builder->globalEnums(); result.m_enums = m_builder->typeEntryToEnumsHash(); + result.m_flags = flags; return result; } diff --git a/sources/shiboken6/ApiExtractor/apiextractorresult.h b/sources/shiboken6/ApiExtractor/apiextractorresult.h index 18b07a1b7..c40dcb936 100644 --- a/sources/shiboken6/ApiExtractor/apiextractorresult.h +++ b/sources/shiboken6/ApiExtractor/apiextractorresult.h @@ -30,6 +30,7 @@ #define APIEXTRACTORRESULT_H #include "abstractmetalang.h" +#include "apiextractorflags.h" #include "abstractmetaenum.h" #include "abstractmetatype.h" #include "typesystem_typedefs.h" @@ -63,6 +64,9 @@ public: AbstractMetaFunctionCList implicitConversions(const TypeEntry *type) const; AbstractMetaFunctionCList implicitConversions(const AbstractMetaType &metaType) const; + ApiExtractorFlags flags() const { return m_flags; } + void setFlags(ApiExtractorFlags f) { m_flags = f; } + private: AbstractMetaClassCList m_metaClasses; AbstractMetaClassCList m_smartPointers; @@ -70,6 +74,8 @@ private: AbstractMetaEnumList m_globalEnums; QHash<const TypeEntry *, AbstractMetaEnum> m_enums; + + ApiExtractorFlags m_flags; }; #endif // APIEXTRACTORRESULT_H diff --git a/sources/shiboken6/generator/generator.cpp b/sources/shiboken6/generator/generator.cpp index 2b25e300a..35ecbc780 100644 --- a/sources/shiboken6/generator/generator.cpp +++ b/sources/shiboken6/generator/generator.cpp @@ -738,6 +738,7 @@ std::optional<DefaultValue> const auto &constructors = metaClass->queryFunctions(FunctionQueryOption::Constructors); for (const auto &ctor : constructors) { if (!ctor->isUserAdded() && !ctor->isPrivate() + && (ctor->isPublic() || !api.flags().testFlag(ApiExtractorFlag::AvoidProtectedHack)) && ctor->functionType() == AbstractMetaFunction::ConstructorFunction) { // No arguments: Default constructible const auto &arguments = ctor->arguments(); |