aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFriedemann Kleint <Friedemann.Kleint@qt.io>2017-03-01 14:45:03 +0100
committerFriedemann Kleint <Friedemann.Kleint@qt.io>2017-03-02 08:26:56 +0000
commit8ea1045330964d71211ac8e9580858b2b4aac5c7 (patch)
treef35f26c8b45d65c1ffb0dab202f1601bc79a5619
parent1066b1aedf2f502178b3e515683835973a249296 (diff)
Generators: Exclude functions using rvalue references
Introduce a convenience function to check and use that in the generators. Task-number: PYSIDE-323 Change-Id: Iccd2907bb8f41d212087984a35a2b5efa7121546 Reviewed-by: Christian Tismer <tismer@stackless.com>
-rw-r--r--ApiExtractor/abstractmetalang.cpp19
-rw-r--r--ApiExtractor/abstractmetalang.h1
-rw-r--r--generator/shiboken2/cppgenerator.cpp5
-rw-r--r--generator/shiboken2/shibokengenerator.cpp3
4 files changed, 24 insertions, 4 deletions
diff --git a/ApiExtractor/abstractmetalang.cpp b/ApiExtractor/abstractmetalang.cpp
index 57b7262..cc3283a 100644
--- a/ApiExtractor/abstractmetalang.cpp
+++ b/ApiExtractor/abstractmetalang.cpp
@@ -517,6 +517,19 @@ AbstractMetaFunction *AbstractMetaFunction::copy() const
return cpy;
}
+bool AbstractMetaFunction::usesRValueReferences() const
+{
+ if (m_functionType == MoveConstructorFunction || m_functionType == MoveAssignmentOperatorFunction)
+ return true;
+ if (m_type && m_type->referenceType() == RValueReference)
+ return true;
+ foreach (const AbstractMetaArgument *a, m_arguments) {
+ if (a->type()->referenceType() == RValueReference)
+ return true;
+ }
+ return false;
+}
+
QStringList AbstractMetaFunction::introspectionCompatibleSignatures(const QStringList &resolvedArguments) const
{
AbstractMetaArgumentList arguments = this->arguments();
@@ -1408,13 +1421,17 @@ AbstractMetaFunctionList AbstractMetaClass::implicitConversions() const
AbstractMetaFunctionList returned;
AbstractMetaFunctionList list = queryFunctions(Constructors);
+
list.append(externalConversionOperators());
+ // Exclude anything that uses rvalue references, be it a move
+ // constructor "QPolygon(QPolygon &&)" or something else like
+ // "QPolygon(QVector<QPoint> &&)".
foreach (AbstractMetaFunction *f, list) {
if ((f->actualMinimumArgumentCount() == 1 || f->arguments().size() == 1 || f->isConversionOperator())
&& !f->isExplicit()
&& f->functionType() != AbstractMetaFunction::CopyConstructorFunction
- && f->functionType() != AbstractMetaFunction::MoveConstructorFunction
+ && !f->usesRValueReferences()
&& !f->isModifiedRemoved()
&& (f->originalAttributes() & Public)) {
returned += f;
diff --git a/ApiExtractor/abstractmetalang.h b/ApiExtractor/abstractmetalang.h
index 1eba4be..0201e94 100644
--- a/ApiExtractor/abstractmetalang.h
+++ b/ApiExtractor/abstractmetalang.h
@@ -1066,6 +1066,7 @@ public:
m_functionType = type;
}
+ bool usesRValueReferences() const;
QStringList introspectionCompatibleSignatures(const QStringList &resolvedArguments = QStringList()) const;
QString signature() const;
QString targetLangSignature(bool minimal = false) const;
diff --git a/generator/shiboken2/cppgenerator.cpp b/generator/shiboken2/cppgenerator.cpp
index a76af30..512782b 100644
--- a/generator/shiboken2/cppgenerator.cpp
+++ b/generator/shiboken2/cppgenerator.cpp
@@ -148,8 +148,10 @@ QList<AbstractMetaFunctionList> CppGenerator::filterGroupedOperatorFunctions(con
QMap<QPair<QString, int >, AbstractMetaFunctionList> results;
const AbstractMetaClass::OperatorQueryOptions query(queryIn);
foreach (AbstractMetaFunction* func, metaClass->operatorOverloads(query)) {
- if (func->isModifiedRemoved() || func->name() == QLatin1String("operator[]") || func->name() == QLatin1String("operator->"))
+ if (func->isModifiedRemoved() || func->usesRValueReferences()
+ || func->name() == QLatin1String("operator[]") || func->name() == QLatin1String("operator->")) {
continue;
+ }
int args;
if (func->isComparisonOperator()) {
args = -1;
@@ -324,6 +326,7 @@ void CppGenerator::generateClass(QTextStream &s, const AbstractMetaClass *metaCl
AbstractMetaFunctionList overloads;
foreach (AbstractMetaFunction* func, it.value()) {
if (!func->isAssignmentOperator()
+ && !func->usesRValueReferences()
&& !func->isCastOperator()
&& !func->isModifiedRemoved()
&& (!func->isPrivate() || func->functionType() == AbstractMetaFunction::EmptyFunction)
diff --git a/generator/shiboken2/shibokengenerator.cpp b/generator/shiboken2/shibokengenerator.cpp
index 45401d3..7d851fd 100644
--- a/generator/shiboken2/shibokengenerator.cpp
+++ b/generator/shiboken2/shibokengenerator.cpp
@@ -1403,8 +1403,7 @@ AbstractMetaFunctionList ShibokenGenerator::filterFunctions(const AbstractMetaCl
{
AbstractMetaFunctionList result;
foreach (AbstractMetaFunction *func, metaClass->functions()) {
- //skip signals
- if (func->isSignal() || func->isDestructor()
+ if (func->isSignal() || func->isDestructor() || func->usesRValueReferences()
|| (func->isModifiedRemoved() && !func->isAbstract()
&& (!avoidProtectedHack() || !func->isProtected())))
continue;