Introduce Q_NAMESPACE_EXPORT

A recurring problem with the Q_NAMESPACE macro is that it declares
an object (staticMetaObject) in the surrounding namespace. That
object lacks any export/import qualification to make it usable
with shared libraries.

Introduce therefore another macro to work around this issue, allowing
the user to prefix the object with an exporting macro, f.i. like this:

Q_NAMESPACE_EXPORT(Q_CORE_EXPORT)

The old macro can simply then be rewritten in terms of this new one,
supplying an empty export macro.

Note that NOT passing an argument to a macro expecting one is well
defined behavior in C99 -- the macro will expand an empty token.
Of course, MSVC doesn't like this and emits warnings. As a
workaround, use a variadic macro.

[ChangeLog][QtCore] Added the new Q_NAMESPACE_EXPORT macro. It
can be used just like Q_NAMESPACE to add meta-object information
to a namespace; however it also supports exporting of such
information from shared libraries.

[ChangeLog][Potentially Source-Incompatible Changes] Prefixing
Q_NAMESPACE with an export macro may no longer work. Use the new
Q_NAMESPACE_EXPORT macro for that use case.

Fixes: QTBUG-68014
Change-Id: Ib044a555ace1f77ae8e0244d824ec473550f3d8e
Reviewed-by: Edward Welbourne <edward.welbourne@qt.io>
Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
Reviewed-by: BogDan Vatra <bogdan@kdab.com>
This commit is contained in:
Giuseppe D'Angelo 2019-04-30 09:39:21 +02:00
parent 8f0e3ad518
commit f66c1db16c
10 changed files with 245 additions and 183 deletions

View File

@ -118,6 +118,7 @@ Cpp.ignoretokens += \
Q_POSITIONING_EXPORT \
Q_MULTIMEDIA_EXPORT \
Q_NAMESPACE \
Q_NAMESPACE_EXPORT \
Q_NETWORK_EXPORT \
Q_NEVER_INLINE \
Q_NORETURN \

View File

@ -946,10 +946,12 @@ bool QMakeSourceFileInfo::findMocs(SourceFile *file)
debug_msg(2, "findMocs: %s", file->file.local().toLatin1().constData());
int line_count = 1;
bool ignore[3] = { false, false, false }; // [0] for Q_OBJECT, [1] for Q_GADGET, [2] for Q_NAMESPACE
// [0] for Q_OBJECT, [1] for Q_GADGET, [2] for Q_NAMESPACE, [3] for Q_NAMESPACE_EXPORT
bool ignore[4] = { false, false, false, false };
/* qmake ignore Q_GADGET */
/* qmake ignore Q_OBJECT */
/* qmake ignore Q_NAMESPACE */
/* qmake ignore Q_NAMESPACE_EXPORT */
for(int x = 0; x < buffer_len; x++) {
#define SKIP_BSNL(pos) skipEscapedLineEnds(buffer, buffer_len, (pos), &line_count)
x = SKIP_BSNL(x);
@ -988,6 +990,12 @@ bool QMakeSourceFileInfo::findMocs(SourceFile *file)
file->file.real().toLatin1().constData(), line_count);
x += 23;
ignore[2] = true;
} else if (buffer_len >= (x + 30) &&
!strncmp(buffer + x + 1, "make ignore Q_NAMESPACE_EXPORT", 30)) {
debug_msg(2, "Mocgen: %s:%d Found \"qmake ignore Q_NAMESPACE_EXPORT\"",
file->file.real().toLatin1().constData(), line_count);
x += 30;
ignore[3] = true;
}
} else if (buffer[x] == '*') {
extralines = 0;
@ -1015,8 +1023,8 @@ bool QMakeSourceFileInfo::findMocs(SourceFile *file)
int morelines = 0;
int y = skipEscapedLineEnds(buffer, buffer_len, x + 1, &morelines);
if (buffer[y] == 'Q') {
static const char interesting[][12] = { "Q_OBJECT", "Q_GADGET", "Q_NAMESPACE"};
for (int interest = 0; interest < 3; ++interest) {
static const char interesting[][19] = { "Q_OBJECT", "Q_GADGET", "Q_NAMESPACE", "Q_NAMESPACE_EXPORT" };
for (int interest = 0; interest < 4; ++interest) {
if (ignore[interest])
continue;

View File

@ -4526,6 +4526,24 @@ QDebug operator<<(QDebug dbg, const QObject *o)
Q_NAMESPACE makes an external variable, \c{staticMetaObject}, available.
\c{staticMetaObject} is of type QMetaObject and provides access to the
enums declared with Q_ENUM_NS/Q_FLAG_NS.
\sa Q_NAMESPACE_EXPORT
*/
/*!
\macro Q_NAMESPACE_EXPORT(EXPORT_MACRO)
\relates QObject
\since 5.14
The Q_NAMESPACE_EXPORT macro can be used to add QMetaObject capabilities
to a namespace.
It works exactly like the Q_NAMESPACE macro. However, the external
\c{staticMetaObject} variable that gets defined in the namespace
is declared with the supplied \c{EXPORT_MACRO} qualifier. This is
useful f.i. if the object needs to be exported from a dynamic library.
\sa Q_NAMESPACE, {Creating Shared Libraries}
*/
/*!

View File

@ -201,12 +201,16 @@ private: \
QT_ANNOTATE_CLASS(qt_qgadget, "") \
/*end*/
/* qmake ignore Q_NAMESPACE */
#define Q_NAMESPACE \
extern const QMetaObject staticMetaObject; \
/* qmake ignore Q_NAMESPACE_EXPORT */
#define Q_NAMESPACE_EXPORT(...) \
extern __VA_ARGS__ const QMetaObject staticMetaObject; \
QT_ANNOTATE_CLASS(qt_qnamespace, "") \
/*end*/
/* qmake ignore Q_NAMESPACE */
#define Q_NAMESPACE Q_NAMESPACE_EXPORT() \
/*end*/
#endif // QT_NO_META_MACROS
#else // Q_MOC_RUN

View File

@ -59,7 +59,7 @@ QT_BEGIN_NAMESPACE
namespace QShaderLanguage
{
Q_GUI_EXPORT Q_NAMESPACE
Q_NAMESPACE_EXPORT(Q_GUI_EXPORT)
enum StorageQualifier : char {
Const = 1,

View File

@ -30,12 +30,12 @@
// DO NOT EDIT.
static const short keyword_trans[][128] = {
{0,0,0,0,0,0,0,0,0,561,558,0,0,0,0,0,
{0,0,0,0,0,0,0,0,0,568,565,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
561,252,559,562,8,38,239,560,25,26,236,234,30,235,27,237,
568,252,566,569,8,38,239,567,25,26,236,234,30,235,27,237,
22,22,22,22,22,22,22,22,22,22,34,41,23,39,24,43,
0,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,
8,21,8,8,8,8,8,8,8,8,8,31,564,32,238,8,
8,21,8,8,8,8,8,8,8,8,8,31,571,32,238,8,
0,1,2,3,4,5,6,7,8,9,8,8,10,11,12,13,
14,8,15,16,17,18,19,20,8,8,8,36,245,37,248,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
@ -116,7 +116,7 @@ static const short keyword_trans[][128] = {
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,290,222,0,0,490,0,0,0,
0,0,0,0,0,0,0,0,290,222,0,0,497,0,0,0,
0,0,0,0,55,0,0,330,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
@ -155,7 +155,7 @@ static const short keyword_trans[][128] = {
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,514,0,0,0,0,0,0,0,0,0,0,357,
0,0,0,0,521,0,0,0,0,0,0,0,0,0,0,357,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
@ -177,7 +177,7 @@ static const short keyword_trans[][128] = {
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,42,0,0,0,28,0,
567,567,567,567,567,567,567,567,567,567,0,0,0,0,0,0,
574,574,574,574,574,574,574,574,574,574,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
@ -336,7 +336,7 @@ static const short keyword_trans[][128] = {
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,566,0,0,0,0,565,
0,0,0,0,0,0,0,0,0,0,573,0,0,0,0,572,
0,0,0,0,0,0,0,0,0,0,0,0,0,258,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
@ -372,29 +372,29 @@ static const short keyword_trans[][128] = {
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,487,0,0,0,300,0,0,0,0,0,0,0,0,0,0,
0,494,0,0,0,300,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,468,417,401,409,373,0,477,0,0,0,0,364,358,
379,0,550,465,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,475,424,408,416,380,0,484,0,0,0,0,364,358,
386,0,557,472,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,387,0,0,0,
0,0,380,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,394,0,0,0,
0,0,387,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,504,0,0,0,0,0,381,
0,0,0,0,0,0,0,0,0,511,0,0,0,0,0,388,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
@ -403,7 +403,7 @@ static const short keyword_trans[][128] = {
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,405,0,0,0,0,0,0,0,0,0,0,0,406,
0,0,0,412,0,0,0,0,0,0,0,0,0,0,0,413,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
@ -411,14 +411,14 @@ static const short keyword_trans[][128] = {
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,413,0,0,0,0,0,0,0,0,0,0,0,414,
0,0,0,420,0,0,0,0,0,0,0,0,0,0,0,421,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,447,425,0,0,430,0,0,0,439,0,0,
0,0,0,0,0,454,432,0,0,437,0,0,0,446,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
@ -426,7 +426,7 @@ static const short keyword_trans[][128] = {
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,533,0,466,0,0,0,494,0,0,500,0,0,0,
0,0,0,540,0,473,0,0,0,501,0,0,507,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
@ -435,7 +435,7 @@ static const short keyword_trans[][128] = {
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,479,0,526,0,0,0,0,0,0,0,0,0,
0,0,0,0,486,0,533,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
@ -443,7 +443,7 @@ static const short keyword_trans[][128] = {
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
542,0,0,510,0,0,0,0,0,0,0,0,0,0,0,0,
549,0,0,517,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}
};
@ -828,197 +828,204 @@ static const struct
{CHARACTER, 0, 65, 370, CHARACTER},
{CHARACTER, 0, 67, 371, CHARACTER},
{CHARACTER, 0, 69, 372, CHARACTER},
{Q_NAMESPACE_TOKEN, 0, 0, 0, CHARACTER},
{CHARACTER, 0, 65, 374, CHARACTER},
{CHARACTER, 0, 68, 375, CHARACTER},
{CHARACTER, 0, 71, 376, CHARACTER},
{CHARACTER, 0, 69, 377, CHARACTER},
{CHARACTER, 0, 84, 378, CHARACTER},
{Q_NAMESPACE_TOKEN, 0, 95, 373, CHARACTER},
{CHARACTER, 0, 69, 374, CHARACTER},
{CHARACTER, 0, 88, 375, CHARACTER},
{CHARACTER, 0, 80, 376, CHARACTER},
{CHARACTER, 0, 79, 377, CHARACTER},
{CHARACTER, 0, 82, 378, CHARACTER},
{CHARACTER, 0, 84, 379, CHARACTER},
{Q_NAMESPACE_EXPORT_TOKEN, 0, 0, 0, CHARACTER},
{CHARACTER, 0, 65, 381, CHARACTER},
{CHARACTER, 0, 68, 382, CHARACTER},
{CHARACTER, 0, 71, 383, CHARACTER},
{CHARACTER, 0, 69, 384, CHARACTER},
{CHARACTER, 0, 84, 385, CHARACTER},
{Q_GADGET_TOKEN, 0, 0, 0, CHARACTER},
{CHARACTER, 44, 0, 0, CHARACTER},
{CHARACTER, 45, 0, 0, CHARACTER},
{CHARACTER, 0, 80, 382, CHARACTER},
{CHARACTER, 0, 69, 383, CHARACTER},
{CHARACTER, 0, 82, 384, CHARACTER},
{CHARACTER, 0, 84, 385, CHARACTER},
{CHARACTER, 0, 89, 386, CHARACTER},
{CHARACTER, 0, 80, 389, CHARACTER},
{CHARACTER, 0, 69, 390, CHARACTER},
{CHARACTER, 0, 82, 391, CHARACTER},
{CHARACTER, 0, 84, 392, CHARACTER},
{CHARACTER, 0, 89, 393, CHARACTER},
{Q_PROPERTY_TOKEN, 0, 0, 0, CHARACTER},
{CHARACTER, 0, 85, 388, CHARACTER},
{CHARACTER, 0, 71, 389, CHARACTER},
{CHARACTER, 0, 73, 390, CHARACTER},
{CHARACTER, 0, 78, 391, CHARACTER},
{CHARACTER, 0, 95, 392, CHARACTER},
{CHARACTER, 0, 77, 393, CHARACTER},
{CHARACTER, 0, 69, 394, CHARACTER},
{CHARACTER, 0, 84, 395, CHARACTER},
{CHARACTER, 0, 65, 396, CHARACTER},
{CHARACTER, 0, 68, 397, CHARACTER},
{CHARACTER, 0, 65, 398, CHARACTER},
{CHARACTER, 0, 84, 399, CHARACTER},
{CHARACTER, 0, 65, 400, CHARACTER},
{CHARACTER, 0, 85, 395, CHARACTER},
{CHARACTER, 0, 71, 396, CHARACTER},
{CHARACTER, 0, 73, 397, CHARACTER},
{CHARACTER, 0, 78, 398, CHARACTER},
{CHARACTER, 0, 95, 399, CHARACTER},
{CHARACTER, 0, 77, 400, CHARACTER},
{CHARACTER, 0, 69, 401, CHARACTER},
{CHARACTER, 0, 84, 402, CHARACTER},
{CHARACTER, 0, 65, 403, CHARACTER},
{CHARACTER, 0, 68, 404, CHARACTER},
{CHARACTER, 0, 65, 405, CHARACTER},
{CHARACTER, 0, 84, 406, CHARACTER},
{CHARACTER, 0, 65, 407, CHARACTER},
{Q_PLUGIN_METADATA_TOKEN, 0, 0, 0, CHARACTER},
{CHARACTER, 0, 78, 402, CHARACTER},
{CHARACTER, 0, 85, 403, CHARACTER},
{CHARACTER, 0, 77, 404, CHARACTER},
{CHARACTER, 0, 78, 409, CHARACTER},
{CHARACTER, 0, 85, 410, CHARACTER},
{CHARACTER, 0, 77, 411, CHARACTER},
{Q_ENUM_TOKEN, 46, 0, 0, CHARACTER},
{Q_ENUMS_TOKEN, 0, 0, 0, CHARACTER},
{CHARACTER, 0, 78, 407, CHARACTER},
{CHARACTER, 0, 83, 408, CHARACTER},
{CHARACTER, 0, 78, 414, CHARACTER},
{CHARACTER, 0, 83, 415, CHARACTER},
{Q_ENUM_NS_TOKEN, 0, 0, 0, CHARACTER},
{CHARACTER, 0, 76, 410, CHARACTER},
{CHARACTER, 0, 65, 411, CHARACTER},
{CHARACTER, 0, 71, 412, CHARACTER},
{CHARACTER, 0, 76, 417, CHARACTER},
{CHARACTER, 0, 65, 418, CHARACTER},
{CHARACTER, 0, 71, 419, CHARACTER},
{Q_FLAG_TOKEN, 47, 0, 0, CHARACTER},
{Q_FLAGS_TOKEN, 0, 0, 0, CHARACTER},
{CHARACTER, 0, 78, 415, CHARACTER},
{CHARACTER, 0, 83, 416, CHARACTER},
{CHARACTER, 0, 78, 422, CHARACTER},
{CHARACTER, 0, 83, 423, CHARACTER},
{Q_FLAG_NS_TOKEN, 0, 0, 0, CHARACTER},
{CHARACTER, 0, 69, 418, CHARACTER},
{CHARACTER, 0, 67, 419, CHARACTER},
{CHARACTER, 0, 76, 420, CHARACTER},
{CHARACTER, 0, 65, 421, CHARACTER},
{CHARACTER, 0, 82, 422, CHARACTER},
{CHARACTER, 0, 69, 423, CHARACTER},
{CHARACTER, 0, 95, 424, CHARACTER},
{CHARACTER, 0, 69, 425, CHARACTER},
{CHARACTER, 0, 67, 426, CHARACTER},
{CHARACTER, 0, 76, 427, CHARACTER},
{CHARACTER, 0, 65, 428, CHARACTER},
{CHARACTER, 0, 82, 429, CHARACTER},
{CHARACTER, 0, 69, 430, CHARACTER},
{CHARACTER, 0, 95, 431, CHARACTER},
{CHARACTER, 48, 0, 0, CHARACTER},
{CHARACTER, 0, 76, 426, CHARACTER},
{CHARACTER, 0, 65, 427, CHARACTER},
{CHARACTER, 0, 71, 428, CHARACTER},
{CHARACTER, 0, 83, 429, CHARACTER},
{CHARACTER, 0, 76, 433, CHARACTER},
{CHARACTER, 0, 65, 434, CHARACTER},
{CHARACTER, 0, 71, 435, CHARACTER},
{CHARACTER, 0, 83, 436, CHARACTER},
{Q_DECLARE_FLAGS_TOKEN, 0, 0, 0, CHARACTER},
{CHARACTER, 0, 78, 431, CHARACTER},
{CHARACTER, 0, 84, 432, CHARACTER},
{CHARACTER, 0, 69, 433, CHARACTER},
{CHARACTER, 0, 82, 434, CHARACTER},
{CHARACTER, 0, 70, 435, CHARACTER},
{CHARACTER, 0, 65, 436, CHARACTER},
{CHARACTER, 0, 67, 437, CHARACTER},
{CHARACTER, 0, 69, 438, CHARACTER},
{Q_DECLARE_INTERFACE_TOKEN, 0, 0, 0, CHARACTER},
{CHARACTER, 0, 78, 438, CHARACTER},
{CHARACTER, 0, 84, 439, CHARACTER},
{CHARACTER, 0, 69, 440, CHARACTER},
{CHARACTER, 0, 84, 441, CHARACTER},
{CHARACTER, 0, 65, 442, CHARACTER},
{CHARACTER, 0, 84, 443, CHARACTER},
{CHARACTER, 0, 89, 444, CHARACTER},
{CHARACTER, 0, 80, 445, CHARACTER},
{CHARACTER, 0, 69, 446, CHARACTER},
{CHARACTER, 0, 82, 441, CHARACTER},
{CHARACTER, 0, 70, 442, CHARACTER},
{CHARACTER, 0, 65, 443, CHARACTER},
{CHARACTER, 0, 67, 444, CHARACTER},
{CHARACTER, 0, 69, 445, CHARACTER},
{Q_DECLARE_INTERFACE_TOKEN, 0, 0, 0, CHARACTER},
{CHARACTER, 0, 69, 447, CHARACTER},
{CHARACTER, 0, 84, 448, CHARACTER},
{CHARACTER, 0, 65, 449, CHARACTER},
{CHARACTER, 0, 84, 450, CHARACTER},
{CHARACTER, 0, 89, 451, CHARACTER},
{CHARACTER, 0, 80, 452, CHARACTER},
{CHARACTER, 0, 69, 453, CHARACTER},
{Q_DECLARE_METATYPE_TOKEN, 0, 0, 0, CHARACTER},
{CHARACTER, 0, 88, 448, CHARACTER},
{CHARACTER, 0, 84, 449, CHARACTER},
{CHARACTER, 0, 69, 450, CHARACTER},
{CHARACTER, 0, 78, 451, CHARACTER},
{CHARACTER, 0, 83, 452, CHARACTER},
{CHARACTER, 0, 73, 453, CHARACTER},
{CHARACTER, 0, 79, 454, CHARACTER},
{CHARACTER, 0, 78, 455, CHARACTER},
{CHARACTER, 0, 95, 456, CHARACTER},
{CHARACTER, 0, 73, 457, CHARACTER},
{CHARACTER, 0, 88, 455, CHARACTER},
{CHARACTER, 0, 84, 456, CHARACTER},
{CHARACTER, 0, 69, 457, CHARACTER},
{CHARACTER, 0, 78, 458, CHARACTER},
{CHARACTER, 0, 84, 459, CHARACTER},
{CHARACTER, 0, 69, 460, CHARACTER},
{CHARACTER, 0, 82, 461, CHARACTER},
{CHARACTER, 0, 70, 462, CHARACTER},
{CHARACTER, 0, 65, 463, CHARACTER},
{CHARACTER, 0, 67, 464, CHARACTER},
{CHARACTER, 0, 69, 438, CHARACTER},
{CHARACTER, 49, 0, 0, CHARACTER},
{CHARACTER, 0, 84, 467, CHARACTER},
{CHARACTER, 0, 83, 413, CHARACTER},
{CHARACTER, 0, 76, 469, CHARACTER},
{CHARACTER, 0, 83, 459, CHARACTER},
{CHARACTER, 0, 73, 460, CHARACTER},
{CHARACTER, 0, 79, 461, CHARACTER},
{CHARACTER, 0, 78, 462, CHARACTER},
{CHARACTER, 0, 95, 463, CHARACTER},
{CHARACTER, 0, 73, 464, CHARACTER},
{CHARACTER, 0, 78, 465, CHARACTER},
{CHARACTER, 0, 84, 466, CHARACTER},
{CHARACTER, 0, 69, 467, CHARACTER},
{CHARACTER, 0, 82, 468, CHARACTER},
{CHARACTER, 0, 70, 469, CHARACTER},
{CHARACTER, 0, 65, 470, CHARACTER},
{CHARACTER, 0, 83, 471, CHARACTER},
{CHARACTER, 0, 83, 472, CHARACTER},
{CHARACTER, 0, 73, 473, CHARACTER},
{CHARACTER, 0, 78, 474, CHARACTER},
{CHARACTER, 0, 70, 475, CHARACTER},
{CHARACTER, 0, 79, 476, CHARACTER},
{Q_CLASSINFO_TOKEN, 0, 0, 0, CHARACTER},
{CHARACTER, 0, 78, 478, CHARACTER},
{CHARACTER, 50, 0, 0, CHARACTER},
{CHARACTER, 0, 69, 480, CHARACTER},
{CHARACTER, 0, 82, 481, CHARACTER},
{CHARACTER, 0, 67, 471, CHARACTER},
{CHARACTER, 0, 69, 445, CHARACTER},
{CHARACTER, 49, 0, 0, CHARACTER},
{CHARACTER, 0, 84, 474, CHARACTER},
{CHARACTER, 0, 83, 420, CHARACTER},
{CHARACTER, 0, 76, 476, CHARACTER},
{CHARACTER, 0, 65, 477, CHARACTER},
{CHARACTER, 0, 83, 478, CHARACTER},
{CHARACTER, 0, 83, 479, CHARACTER},
{CHARACTER, 0, 73, 480, CHARACTER},
{CHARACTER, 0, 78, 481, CHARACTER},
{CHARACTER, 0, 70, 482, CHARACTER},
{CHARACTER, 0, 65, 483, CHARACTER},
{CHARACTER, 0, 67, 484, CHARACTER},
{CHARACTER, 0, 69, 485, CHARACTER},
{CHARACTER, 0, 83, 486, CHARACTER},
{CHARACTER, 0, 79, 483, CHARACTER},
{Q_CLASSINFO_TOKEN, 0, 0, 0, CHARACTER},
{CHARACTER, 0, 78, 485, CHARACTER},
{CHARACTER, 50, 0, 0, CHARACTER},
{CHARACTER, 0, 69, 487, CHARACTER},
{CHARACTER, 0, 82, 488, CHARACTER},
{CHARACTER, 0, 70, 489, CHARACTER},
{CHARACTER, 0, 65, 490, CHARACTER},
{CHARACTER, 0, 67, 491, CHARACTER},
{CHARACTER, 0, 69, 492, CHARACTER},
{CHARACTER, 0, 83, 493, CHARACTER},
{Q_INTERFACES_TOKEN, 0, 0, 0, CHARACTER},
{CHARACTER, 0, 108, 488, CHARACTER},
{CHARACTER, 0, 115, 489, CHARACTER},
{CHARACTER, 0, 108, 495, CHARACTER},
{CHARACTER, 0, 115, 496, CHARACTER},
{SIGNALS, 0, 0, 0, CHARACTER},
{CHARACTER, 0, 111, 491, CHARACTER},
{CHARACTER, 0, 116, 492, CHARACTER},
{CHARACTER, 0, 115, 493, CHARACTER},
{CHARACTER, 0, 111, 498, CHARACTER},
{CHARACTER, 0, 116, 499, CHARACTER},
{CHARACTER, 0, 115, 500, CHARACTER},
{SLOTS, 0, 0, 0, CHARACTER},
{CHARACTER, 0, 71, 495, CHARACTER},
{CHARACTER, 0, 78, 496, CHARACTER},
{CHARACTER, 0, 65, 497, CHARACTER},
{CHARACTER, 0, 76, 498, CHARACTER},
{Q_SIGNAL_TOKEN, 0, 83, 499, CHARACTER},
{CHARACTER, 0, 71, 502, CHARACTER},
{CHARACTER, 0, 78, 503, CHARACTER},
{CHARACTER, 0, 65, 504, CHARACTER},
{CHARACTER, 0, 76, 505, CHARACTER},
{Q_SIGNAL_TOKEN, 0, 83, 506, CHARACTER},
{Q_SIGNALS_TOKEN, 0, 0, 0, CHARACTER},
{CHARACTER, 0, 79, 501, CHARACTER},
{CHARACTER, 0, 84, 502, CHARACTER},
{Q_SLOT_TOKEN, 0, 83, 503, CHARACTER},
{CHARACTER, 0, 79, 508, CHARACTER},
{CHARACTER, 0, 84, 509, CHARACTER},
{Q_SLOT_TOKEN, 0, 83, 510, CHARACTER},
{Q_SLOTS_TOKEN, 0, 0, 0, CHARACTER},
{CHARACTER, 0, 86, 505, CHARACTER},
{CHARACTER, 0, 65, 506, CHARACTER},
{CHARACTER, 0, 84, 507, CHARACTER},
{CHARACTER, 0, 69, 508, CHARACTER},
{CHARACTER, 0, 95, 509, CHARACTER},
{CHARACTER, 0, 86, 512, CHARACTER},
{CHARACTER, 0, 65, 513, CHARACTER},
{CHARACTER, 0, 84, 514, CHARACTER},
{CHARACTER, 0, 69, 515, CHARACTER},
{CHARACTER, 0, 95, 516, CHARACTER},
{CHARACTER, 51, 0, 0, CHARACTER},
{CHARACTER, 0, 76, 511, CHARACTER},
{CHARACTER, 0, 79, 512, CHARACTER},
{CHARACTER, 0, 84, 513, CHARACTER},
{CHARACTER, 0, 76, 518, CHARACTER},
{CHARACTER, 0, 79, 519, CHARACTER},
{CHARACTER, 0, 84, 520, CHARACTER},
{Q_PRIVATE_SLOT_TOKEN, 0, 0, 0, CHARACTER},
{CHARACTER, 0, 95, 515, CHARACTER},
{CHARACTER, 0, 77, 516, CHARACTER},
{CHARACTER, 0, 79, 517, CHARACTER},
{CHARACTER, 0, 67, 518, CHARACTER},
{CHARACTER, 0, 95, 519, CHARACTER},
{CHARACTER, 0, 67, 520, CHARACTER},
{CHARACTER, 0, 79, 521, CHARACTER},
{CHARACTER, 0, 77, 522, CHARACTER},
{CHARACTER, 0, 80, 523, CHARACTER},
{CHARACTER, 0, 65, 524, CHARACTER},
{CHARACTER, 0, 84, 525, CHARACTER},
{CHARACTER, 0, 95, 522, CHARACTER},
{CHARACTER, 0, 77, 523, CHARACTER},
{CHARACTER, 0, 79, 524, CHARACTER},
{CHARACTER, 0, 67, 525, CHARACTER},
{CHARACTER, 0, 95, 526, CHARACTER},
{CHARACTER, 0, 67, 527, CHARACTER},
{CHARACTER, 0, 79, 528, CHARACTER},
{CHARACTER, 0, 77, 529, CHARACTER},
{CHARACTER, 0, 80, 530, CHARACTER},
{CHARACTER, 0, 65, 531, CHARACTER},
{CHARACTER, 0, 84, 532, CHARACTER},
{Q_MOC_COMPAT_TOKEN, 0, 0, 0, CHARACTER},
{CHARACTER, 0, 79, 527, CHARACTER},
{CHARACTER, 0, 75, 528, CHARACTER},
{CHARACTER, 0, 65, 529, CHARACTER},
{CHARACTER, 0, 66, 530, CHARACTER},
{CHARACTER, 0, 76, 531, CHARACTER},
{CHARACTER, 0, 69, 532, CHARACTER},
{CHARACTER, 0, 79, 534, CHARACTER},
{CHARACTER, 0, 75, 535, CHARACTER},
{CHARACTER, 0, 65, 536, CHARACTER},
{CHARACTER, 0, 66, 537, CHARACTER},
{CHARACTER, 0, 76, 538, CHARACTER},
{CHARACTER, 0, 69, 539, CHARACTER},
{Q_INVOKABLE_TOKEN, 0, 0, 0, CHARACTER},
{CHARACTER, 0, 82, 534, CHARACTER},
{CHARACTER, 0, 73, 535, CHARACTER},
{CHARACTER, 0, 80, 536, CHARACTER},
{CHARACTER, 0, 84, 537, CHARACTER},
{CHARACTER, 0, 65, 538, CHARACTER},
{CHARACTER, 0, 66, 539, CHARACTER},
{CHARACTER, 0, 76, 540, CHARACTER},
{CHARACTER, 0, 69, 541, CHARACTER},
{CHARACTER, 0, 82, 541, CHARACTER},
{CHARACTER, 0, 73, 542, CHARACTER},
{CHARACTER, 0, 80, 543, CHARACTER},
{CHARACTER, 0, 84, 544, CHARACTER},
{CHARACTER, 0, 65, 545, CHARACTER},
{CHARACTER, 0, 66, 546, CHARACTER},
{CHARACTER, 0, 76, 547, CHARACTER},
{CHARACTER, 0, 69, 548, CHARACTER},
{Q_SCRIPTABLE_TOKEN, 0, 0, 0, CHARACTER},
{CHARACTER, 0, 82, 543, CHARACTER},
{CHARACTER, 0, 79, 544, CHARACTER},
{CHARACTER, 0, 80, 545, CHARACTER},
{CHARACTER, 0, 69, 546, CHARACTER},
{CHARACTER, 0, 82, 547, CHARACTER},
{CHARACTER, 0, 84, 548, CHARACTER},
{CHARACTER, 0, 89, 549, CHARACTER},
{CHARACTER, 0, 82, 550, CHARACTER},
{CHARACTER, 0, 79, 551, CHARACTER},
{CHARACTER, 0, 80, 552, CHARACTER},
{CHARACTER, 0, 69, 553, CHARACTER},
{CHARACTER, 0, 82, 554, CHARACTER},
{CHARACTER, 0, 84, 555, CHARACTER},
{CHARACTER, 0, 89, 556, CHARACTER},
{Q_PRIVATE_PROPERTY_TOKEN, 0, 0, 0, CHARACTER},
{CHARACTER, 0, 69, 551, CHARACTER},
{CHARACTER, 0, 86, 552, CHARACTER},
{CHARACTER, 0, 73, 553, CHARACTER},
{CHARACTER, 0, 83, 554, CHARACTER},
{CHARACTER, 0, 73, 555, CHARACTER},
{CHARACTER, 0, 79, 556, CHARACTER},
{CHARACTER, 0, 78, 557, CHARACTER},
{CHARACTER, 0, 69, 558, CHARACTER},
{CHARACTER, 0, 86, 559, CHARACTER},
{CHARACTER, 0, 73, 560, CHARACTER},
{CHARACTER, 0, 83, 561, CHARACTER},
{CHARACTER, 0, 73, 562, CHARACTER},
{CHARACTER, 0, 79, 563, CHARACTER},
{CHARACTER, 0, 78, 564, CHARACTER},
{Q_REVISION_TOKEN, 0, 0, 0, CHARACTER},
{NEWLINE, 0, 0, 0, NOTOKEN},
{QUOTE, 0, 0, 0, NOTOKEN},
{SINGLEQUOTE, 0, 0, 0, NOTOKEN},
{WHITESPACE, 0, 0, 0, NOTOKEN},
{HASH, 0, 35, 563, HASH},
{HASH, 0, 35, 570, HASH},
{PP_HASHHASH, 0, 0, 0, NOTOKEN},
{BACKSLASH, 0, 0, 0, NOTOKEN},
{CPP_COMMENT, 0, 0, 0, NOTOKEN},

View File

@ -620,6 +620,13 @@ void Moc::parse()
case Q_NAMESPACE_TOKEN:
def.hasQNamespace = true;
break;
case Q_NAMESPACE_EXPORT_TOKEN:
next(LPAREN);
while (test(IDENTIFIER))
{}
next(RPAREN);
def.hasQNamespace = true;
break;
case Q_ENUMS_TOKEN:
case Q_ENUM_NS_TOKEN:
parseEnumOrFlag(&def, false);

View File

@ -155,6 +155,7 @@ QT_BEGIN_NAMESPACE
F(Q_OBJECT_TOKEN) \
F(Q_GADGET_TOKEN) \
F(Q_NAMESPACE_TOKEN) \
F(Q_NAMESPACE_EXPORT_TOKEN) \
F(Q_PROPERTY_TOKEN) \
F(Q_PLUGIN_METADATA_TOKEN) \
F(Q_ENUMS_TOKEN) \

View File

@ -214,6 +214,7 @@ static const Keyword keywords[] = {
{ "return", "RETURN" },
{ "Q_OBJECT", "Q_OBJECT_TOKEN" },
{ "Q_NAMESPACE", "Q_NAMESPACE_TOKEN" },
{ "Q_NAMESPACE_EXPORT", "Q_NAMESPACE_EXPORT_TOKEN" },
{ "Q_GADGET", "Q_GADGET_TOKEN" },
{ "Q_PROPERTY", "Q_PROPERTY_TOKEN" },
{ "Q_PLUGIN_METADATA", "Q_PLUGIN_METADATA_TOKEN" },

View File

@ -149,6 +149,17 @@ namespace TestQNamespace {
Q_FLAG_NS(TestFlag2)
}
#define TESTEXPORTMACRO Q_DECL_EXPORT
namespace TestExportNamespace {
Q_NAMESPACE_EXPORT(TESTEXPORTMACRO)
enum class MyEnum {
Key1, Key2
};
Q_ENUM_NS(MyEnum)
}
QT_USE_NAMESPACE
template <bool b> struct QTBUG_31218 {};
@ -3893,6 +3904,10 @@ void tst_Moc::testQNamespace()
QCOMPARE(meta.enclosingMetaObject(), &TestQNamespace::staticMetaObject);
QCOMPARE(meta.keyCount(), 2);
QCOMPARE(TestExportNamespace::staticMetaObject.enumeratorCount(), 1);
checkEnum(TestExportNamespace::staticMetaObject.enumerator(0), "MyEnum",
{{"Key1", 0}, {"Key2", 1}});
QCOMPARE(FooNamespace::staticMetaObject.enumeratorCount(), 1);
QCOMPARE(FooNamespace::FooNestedNamespace::staticMetaObject.enumeratorCount(), 2);
QCOMPARE(FooNamespace::FooNestedNamespace::FooMoreNestedNamespace::staticMetaObject.enumeratorCount(), 1);