QObject: fix GCC 6 warning about qt_static_metacall's 'hidden' attribute use

This warning is triggered when we try to apply the Q_DECL_HIDDEN
attribute to a class in an unnamed namespace. Such classes are
already not exported.

  qobjectdefs.h:175:108: warning: ‘visibility’ attribute ignored [-Wattributes]
  qobjectdefs.h:198:108: warning: ‘visibility’ attribute ignored [-Wattributes]

Added a test on gadgets (and QObjects) in unnamed namespaces,
because qtbase currently does not contain such Q_GADGETs.

Done-with: Thiago Macieira <thiago.macieira@intel.com>
Change-Id: Ic747cc2ab45e4dc6bb70ffff1438c747b05c5672
Reviewed-by: Lars Knoll <lars.knoll@theqtcompany.com>
Reviewed-by: Olivier Goffart (Woboq GmbH) <ogoffart@woboq.com>
bb10
Marc Mutz 2016-03-04 15:19:50 -08:00
parent f8f1bac3f0
commit 2020d2cb63
2 changed files with 63 additions and 2 deletions

View File

@ -152,6 +152,12 @@ inline void qYouForgotTheQ_OBJECT_Macro(T1, T2) {}
# define Q_OBJECT_NO_OVERRIDE_WARNING
#endif
#if defined(Q_CC_GNU) && !defined(Q_CC_INTEL) && Q_CC_GNU >= 600
# define Q_OBJECT_NO_ATTRIBUTES_WARNING QT_WARNING_DISABLE_GCC("-Wattributes")
#else
# define Q_OBJECT_NO_ATTRIBUTES_WARNING
#endif
/* qmake ignore Q_OBJECT */
#define Q_OBJECT \
public: \
@ -162,10 +168,11 @@ public: \
virtual const QMetaObject *metaObject() const; \
virtual void *qt_metacast(const char *); \
virtual int qt_metacall(QMetaObject::Call, int, void **); \
QT_WARNING_POP \
QT_TR_FUNCTIONS \
private: \
Q_OBJECT_NO_ATTRIBUTES_WARNING \
Q_DECL_HIDDEN_STATIC_METACALL static void qt_static_metacall(QObject *, QMetaObject::Call, int, void **); \
QT_WARNING_POP \
struct QPrivateSignal {};
/* qmake ignore Q_OBJECT */
@ -179,7 +186,11 @@ public: \
void qt_check_for_QGADGET_macro(); \
typedef void QtGadgetHelper; \
private: \
Q_DECL_HIDDEN_STATIC_METACALL static void qt_static_metacall(QObject *, QMetaObject::Call, int, void **);
QT_WARNING_PUSH \
Q_OBJECT_NO_ATTRIBUTES_WARNING \
Q_DECL_HIDDEN_STATIC_METACALL static void qt_static_metacall(QObject *, QMetaObject::Call, int, void **); \
QT_WARNING_POP \
/*end*/
#endif // QT_NO_META_MACROS
#else // Q_MOC_RUN

View File

@ -131,6 +131,33 @@ typedef struct {
int doNotConfuseMoc;
} OldStyleCStruct;
namespace {
class GadgetInUnnamedNS
{
Q_GADGET
Q_PROPERTY(int x READ x WRITE setX)
Q_PROPERTY(int y READ y WRITE setY)
public:
explicit GadgetInUnnamedNS(int x, int y) : m_x(x), m_y(y) {}
int x() const { return m_x; }
int y() const { return m_y; }
void setX(int x) { m_x = x; }
void setY(int y) { m_y = y; }
private:
int m_x, m_y;
};
class ObjectInUnnamedNS : public QObject
{
Q_OBJECT
public:
explicit ObjectInUnnamedNS(QObject *parent = Q_NULLPTR) : QObject(parent) {}
};
}
class Sender : public QObject
{
Q_OBJECT
@ -597,6 +624,7 @@ private slots:
void relatedMetaObjectsNameConflict_data();
void relatedMetaObjectsNameConflict();
void strignLiteralsInMacroExtension();
void unnamedNamespaceObjectsAndGadgets();
void veryLongStringData();
void gadgetHierarchy();
@ -3421,6 +3449,28 @@ class VeryLongStringData : public QObject
#undef repeat65534
};
void tst_Moc::unnamedNamespaceObjectsAndGadgets()
{
// these just test very basic functionality of gadgets and objects
// defined in unnamed namespaces.
{
GadgetInUnnamedNS gadget(21, 42);
QCOMPARE(gadget.x(), 21);
QCOMPARE(gadget.y(), 42);
gadget.staticMetaObject.property(0).writeOnGadget(&gadget, 12);
gadget.staticMetaObject.property(1).writeOnGadget(&gadget, 24);
QCOMPARE(gadget.x(), 12);
QCOMPARE(gadget.y(), 24);
}
{
ObjectInUnnamedNS object;
QObject *qObject = &object;
QCOMPARE(static_cast<ObjectInUnnamedNS *>(qObject),
qobject_cast<ObjectInUnnamedNS *>(qObject));
}
}
void tst_Moc::veryLongStringData()
{
const QMetaObject *mobj = &VeryLongStringData::staticMetaObject;