aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFriedemann Kleint <Friedemann.Kleint@qt.io>2022-01-17 13:15:15 +0100
committerFriedemann Kleint <Friedemann.Kleint@qt.io>2022-01-18 16:33:25 +0100
commitef2223f3d712e5f66c4654f7bce2011869ef958a (patch)
tree4e1c7bdfebb81d6afa4b7380fe9c2d32ac0141f1
parentc1e64f5e5583ba6e9e36bf54327747018a2541bc (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>
-rw-r--r--sources/shiboken6/ApiExtractor/abstractmetabuilder.cpp4
-rw-r--r--sources/shiboken6/ApiExtractor/abstractmetalang.cpp6
-rw-r--r--sources/shiboken6/ApiExtractor/abstractmetalang.h3
-rw-r--r--sources/shiboken6/ApiExtractor/apiextractor.cpp1
-rw-r--r--sources/shiboken6/ApiExtractor/apiextractorresult.h6
-rw-r--r--sources/shiboken6/generator/generator.cpp1
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();