Fix compilation of moc generated file with MEMBER properties

If the object has only MEMBER properties, without any other property
specifying READ, the generated will fail to compile with this error:

tst_moc.moc: In member function ‘virtual int ClassWithOneMember::qt_metacall(QMetaObject::Call, int, void**)’:
tst_moc.moc:3810:42: error: ‘_v’ was not declared in this scope

That's because the '_v' is only declared if 'needTempVarForGet' is set,
and it should be set when we have a MEMBER property.

Change-Id: I829fad3faf69654b5a3fd540857df19f4a9449d4
Reviewed-by: Gerhard Gappmeier <gerhard.gappmeier@ascolab.com>
Reviewed-by: Simon Hausmann <simon.hausmann@digia.com>
This commit is contained in:
Olivier Goffart 2013-03-01 15:48:32 +01:00 committed by The Qt Project
parent e786a347c8
commit b0e58a9008
2 changed files with 20 additions and 2 deletions

View File

@ -1,6 +1,7 @@
/****************************************************************************
**
** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).
** Copyright (C) 2013 Olivier Goffart <ogoffart@woboq.com>
** Contact: http://www.qt-project.org/
**
** This file is part of the tools applications of the Qt Toolkit.
@ -896,7 +897,7 @@ void Generator::generateMetacall()
for (int i = 0; i < cdef->propertyList.size(); ++i) {
const PropertyDef &p = cdef->propertyList.at(i);
needGet |= !p.read.isEmpty() || !p.member.isEmpty();
if (!p.read.isEmpty())
if (!p.read.isEmpty() || !p.member.isEmpty())
needTempVarForGet |= (p.gspec != PropertyDef::PointerSpec
&& p.gspec != PropertyDef::ReferenceSpec);

View File

@ -547,7 +547,7 @@ private slots:
void returnRefs();
void memberProperties_data();
void memberProperties();
void memberProperties2();
void privateSignalConnection();
void finalClasses_data();
void finalClasses();
@ -1893,6 +1893,23 @@ void tst_Moc::memberProperties()
}
}
//this used to fail to compile
class ClassWithOneMember : public QObject {
Q_PROPERTY(int member MEMBER member)
Q_OBJECT
public:
int member;
};
void tst_Moc::memberProperties2()
{
ClassWithOneMember o;
o.member = 442;
QCOMPARE(o.property("member").toInt(), 442);
QVERIFY(o.setProperty("member", 6666));
QCOMPARE(o.member, 6666);
}
class SignalConnectionTester : public QObject
{
Q_OBJECT