150 lines
4.8 KiB
Diff
150 lines
4.8 KiB
Diff
From 2020d2cb63b851723e188c002acbe25b5f066525 Mon Sep 17 00:00:00 2001
|
||
From: Marc Mutz <marc.mutz@kdab.com>
|
||
Date: Fri, 4 Mar 2016 15:19:50 -0800
|
||
Subject: [PATCH 221/328] QObject: fix GCC 6 warning about qt_static_metacall's
|
||
'hidden' attribute use
|
||
MIME-Version: 1.0
|
||
Content-Type: text/plain; charset=UTF-8
|
||
Content-Transfer-Encoding: 8bit
|
||
|
||
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>
|
||
---
|
||
src/corelib/kernel/qobjectdefs.h | 15 ++++++++++--
|
||
tests/auto/tools/moc/tst_moc.cpp | 50 ++++++++++++++++++++++++++++++++++++++++
|
||
2 files changed, 63 insertions(+), 2 deletions(-)
|
||
|
||
diff --git a/src/corelib/kernel/qobjectdefs.h b/src/corelib/kernel/qobjectdefs.h
|
||
index b1ed971..2e9ed4f 100644
|
||
--- a/src/corelib/kernel/qobjectdefs.h
|
||
+++ b/src/corelib/kernel/qobjectdefs.h
|
||
@@ -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
|
||
diff --git a/tests/auto/tools/moc/tst_moc.cpp b/tests/auto/tools/moc/tst_moc.cpp
|
||
index c113b7c..5c16c7a 100644
|
||
--- a/tests/auto/tools/moc/tst_moc.cpp
|
||
+++ b/tests/auto/tools/moc/tst_moc.cpp
|
||
@@ -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;
|
||
--
|
||
1.9.3
|
||
|