diff --git a/src/tools/moc/ppkeywords.cpp b/src/tools/moc/ppkeywords.cpp index dc13f3db95d..8931f7b5c0b 100644 --- a/src/tools/moc/ppkeywords.cpp +++ b/src/tools/moc/ppkeywords.cpp @@ -5,18 +5,18 @@ // DO NOT EDIT. static const short pp_keyword_trans[][128] = { - {0,0,0,0,0,0,0,0,0,98,12,0,0,0,0,0, + {0,0,0,0,0,0,0,0,0,111,13,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 98,76,96,13,1,60,62,97,9,10,58,56,11,57,102,59, - 6,6,6,6,6,6,6,6,6,6,92,0,7,81,8,91, + 111,89,109,14,1,73,75,110,10,11,71,69,12,70,115,72, + 7,7,7,7,7,7,7,7,7,7,105,0,8,94,9,104, 0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 1,1,1,1,1,1,1,1,1,1,1,0,101,0,61,1, + 1,1,1,1,1,1,1,1,1,1,1,0,114,0,74,6, 0,1,2,3,4,1,1,1,1,1,1,1,1,1,5,1, - 1,1,1,1,1,1,1,1,1,1,1,0,68,0,71,0}, + 1,1,1,1,1,1,1,1,1,1,1,0,81,0,84,0}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,79,87,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,92,100,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, @@ -24,26 +24,26 @@ static const short pp_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,0,0,0,88,80,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,101,93,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,93,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,106,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,14,34,0,0,0,20,0,0,0,0,0,0, - 0,0,0,0,0,22,0,0,0,0,0,0,0,0,0,0}, + 0,0,0,0,15,35,0,0,0,21,0,0,0,0,0,0, + 0,0,0,0,0,23,0,0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,21,0,0,0,0,0,0,0,44,0, + 0,0,0,0,0,0,22,0,0,0,0,0,0,0,45,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, @@ -51,7 +51,7 @@ static const short pp_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,27,0,0,0,0,0,0,0,0,0,30,0, + 0,0,0,0,28,0,0,0,0,0,0,0,0,0,31,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, @@ -59,7 +59,7 @@ static const short pp_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,0,0,35,0,40,0, + 0,0,0,0,0,0,0,0,0,0,0,0,36,0,41,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, @@ -67,11 +67,11 @@ static const short pp_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,36,0,0,0,0,0,0, - 0,0,0,38,0,0,0,0,0,0,0,0,0,0,0,0}, + 0,0,0,0,0,0,0,0,0,37,0,0,0,0,0,0, + 0,0,0,39,0,0,0,0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,100,0,0,0,0,99, + 0,0,0,0,0,0,0,0,0,0,113,0,0,0,0,112, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, @@ -83,12 +83,12 @@ static const short pp_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,65,0,0,0,0,0,0,0,0,0,0,0,0,0,69, + 0,78,0,0,0,0,0,0,0,0,0,0,0,0,0,82, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 103,103,103,103,103,103,103,103,103,103,0,0,0,0,0,0, + 116,116,116,116,116,116,116,116,116,116,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, @@ -105,10 +105,11 @@ static const struct } pp_keywords[] = { {PP_NOTOKEN, 0, 0, 0, PP_NOTOKEN}, {PP_CHARACTER, 0, 0, 0, PP_NOTOKEN}, - {PP_CHARACTER, 0, 105, 63, PP_NOTOKEN}, - {PP_CHARACTER, 0, 111, 72, PP_NOTOKEN}, - {PP_CHARACTER, 0, 101, 50, PP_NOTOKEN}, - {PP_CHARACTER, 0, 111, 77, PP_NOTOKEN}, + {PP_CHARACTER, 0, 105, 76, PP_NOTOKEN}, + {PP_CHARACTER, 0, 111, 85, PP_NOTOKEN}, + {PP_CHARACTER, 0, 101, 63, PP_NOTOKEN}, + {PP_CHARACTER, 0, 111, 90, PP_NOTOKEN}, + {PP_CHARACTER, 0, 95, 51, PP_NOTOKEN}, {PP_DIGIT, 0, 0, 0, PP_NOTOKEN}, {PP_LANGLE, 1, 0, 0, PP_NOTOKEN}, {PP_RANGLE, 2, 0, 0, PP_NOTOKEN}, @@ -117,78 +118,90 @@ static const struct {PP_COMMA, 0, 0, 0, PP_NOTOKEN}, {PP_NEWLINE, 0, 0, 0, PP_NOTOKEN}, {PP_HASH, 3, 0, 0, PP_HASH}, - {PP_HASH, 0, 101, 15, PP_HASH}, - {PP_HASH, 0, 102, 16, PP_HASH}, - {PP_HASH, 0, 105, 17, PP_HASH}, - {PP_HASH, 0, 110, 18, PP_HASH}, - {PP_HASH, 0, 101, 19, PP_HASH}, + {PP_HASH, 0, 101, 16, PP_HASH}, + {PP_HASH, 0, 102, 17, PP_HASH}, + {PP_HASH, 0, 105, 18, PP_HASH}, + {PP_HASH, 0, 110, 19, PP_HASH}, + {PP_HASH, 0, 101, 20, PP_HASH}, {PP_DEFINE, 0, 0, 0, PP_HASH}, {PP_HASH, 4, 0, 0, PP_HASH}, {PP_IF, 5, 0, 0, PP_HASH}, - {PP_HASH, 0, 110, 23, PP_HASH}, - {PP_HASH, 0, 100, 24, PP_HASH}, - {PP_HASH, 0, 101, 25, PP_HASH}, - {PP_HASH, 0, 102, 26, PP_HASH}, + {PP_HASH, 0, 110, 24, PP_HASH}, + {PP_HASH, 0, 100, 25, PP_HASH}, + {PP_HASH, 0, 101, 26, PP_HASH}, + {PP_HASH, 0, 102, 27, PP_HASH}, {PP_UNDEF, 0, 0, 0, PP_HASH}, - {PP_HASH, 0, 101, 28, PP_HASH}, - {PP_HASH, 0, 102, 29, PP_HASH}, + {PP_HASH, 0, 101, 29, PP_HASH}, + {PP_HASH, 0, 102, 30, PP_HASH}, {PP_IFDEF, 0, 0, 0, PP_HASH}, - {PP_HASH, 0, 100, 31, PP_HASH}, - {PP_HASH, 0, 101, 32, PP_HASH}, - {PP_HASH, 0, 102, 33, PP_HASH}, + {PP_HASH, 0, 100, 32, PP_HASH}, + {PP_HASH, 0, 101, 33, PP_HASH}, + {PP_HASH, 0, 102, 34, PP_HASH}, {PP_IFNDEF, 0, 0, 0, PP_HASH}, {PP_HASH, 6, 0, 0, PP_HASH}, {PP_HASH, 7, 0, 0, PP_HASH}, - {PP_HASH, 0, 102, 37, PP_HASH}, + {PP_HASH, 0, 102, 38, PP_HASH}, {PP_ELIF, 0, 0, 0, PP_HASH}, - {PP_HASH, 0, 101, 39, PP_HASH}, + {PP_HASH, 0, 101, 40, PP_HASH}, {PP_ELSE, 0, 0, 0, PP_HASH}, - {PP_HASH, 0, 100, 41, PP_HASH}, - {PP_HASH, 0, 105, 42, PP_HASH}, - {PP_HASH, 0, 102, 43, PP_HASH}, + {PP_HASH, 0, 100, 42, PP_HASH}, + {PP_HASH, 0, 105, 43, PP_HASH}, + {PP_HASH, 0, 102, 44, PP_HASH}, {PP_ENDIF, 0, 0, 0, PP_HASH}, - {PP_HASH, 0, 99, 45, PP_HASH}, - {PP_HASH, 0, 108, 46, PP_HASH}, - {PP_HASH, 0, 117, 47, PP_HASH}, - {PP_HASH, 0, 100, 48, PP_HASH}, - {PP_HASH, 0, 101, 49, PP_HASH}, + {PP_HASH, 0, 99, 46, PP_HASH}, + {PP_HASH, 0, 108, 47, PP_HASH}, + {PP_HASH, 0, 117, 48, PP_HASH}, + {PP_HASH, 0, 100, 49, PP_HASH}, + {PP_HASH, 0, 101, 50, PP_HASH}, {PP_INCLUDE, 0, 0, 0, PP_HASH}, - {PP_CHARACTER, 0, 102, 51, PP_CHARACTER}, - {PP_CHARACTER, 0, 105, 52, PP_CHARACTER}, - {PP_CHARACTER, 0, 110, 53, PP_CHARACTER}, - {PP_CHARACTER, 0, 101, 54, PP_CHARACTER}, - {PP_CHARACTER, 0, 100, 55, PP_CHARACTER}, + {PP_CHARACTER, 0, 104, 52, PP_CHARACTER}, + {PP_CHARACTER, 0, 97, 53, PP_CHARACTER}, + {PP_CHARACTER, 0, 115, 54, PP_CHARACTER}, + {PP_CHARACTER, 0, 95, 55, PP_CHARACTER}, + {PP_CHARACTER, 0, 105, 56, PP_CHARACTER}, + {PP_CHARACTER, 0, 110, 57, PP_CHARACTER}, + {PP_CHARACTER, 0, 99, 58, PP_CHARACTER}, + {PP_CHARACTER, 0, 108, 59, PP_CHARACTER}, + {PP_CHARACTER, 0, 117, 60, PP_CHARACTER}, + {PP_CHARACTER, 0, 100, 61, PP_CHARACTER}, + {PP_CHARACTER, 0, 101, 62, PP_CHARACTER}, + {PP_HAS_INCLUDE, 0, 0, 0, PP_CHARACTER}, + {PP_CHARACTER, 0, 102, 64, PP_CHARACTER}, + {PP_CHARACTER, 0, 105, 65, PP_CHARACTER}, + {PP_CHARACTER, 0, 110, 66, PP_CHARACTER}, + {PP_CHARACTER, 0, 101, 67, PP_CHARACTER}, + {PP_CHARACTER, 0, 100, 68, PP_CHARACTER}, {PP_DEFINED, 0, 0, 0, PP_CHARACTER}, {PP_PLUS, 0, 0, 0, PP_NOTOKEN}, {PP_MINUS, 0, 0, 0, PP_NOTOKEN}, {PP_STAR, 0, 0, 0, PP_NOTOKEN}, {PP_SLASH, 8, 0, 0, PP_NOTOKEN}, - {PP_PERCENT, 0, 58, 94, PP_NOTOKEN}, + {PP_PERCENT, 0, 58, 107, PP_NOTOKEN}, {PP_HAT, 0, 0, 0, PP_NOTOKEN}, - {PP_AND, 0, 38, 89, PP_NOTOKEN}, - {PP_CHARACTER, 0, 116, 64, PP_CHARACTER}, + {PP_AND, 0, 38, 102, PP_NOTOKEN}, + {PP_CHARACTER, 0, 116, 77, PP_CHARACTER}, {PP_CHARACTER, 9, 0, 0, PP_CHARACTER}, - {PP_CHARACTER, 0, 110, 66, PP_CHARACTER}, - {PP_CHARACTER, 0, 100, 67, PP_CHARACTER}, + {PP_CHARACTER, 0, 110, 79, PP_CHARACTER}, + {PP_CHARACTER, 0, 100, 80, PP_CHARACTER}, {PP_AND, 0, 0, 0, PP_CHARACTER}, - {PP_OR, 0, 124, 90, PP_NOTOKEN}, - {PP_CHARACTER, 0, 114, 70, PP_CHARACTER}, + {PP_OR, 0, 124, 103, PP_NOTOKEN}, + {PP_CHARACTER, 0, 114, 83, PP_CHARACTER}, {PP_OR, 0, 0, 0, PP_CHARACTER}, {PP_TILDE, 0, 0, 0, PP_NOTOKEN}, - {PP_CHARACTER, 0, 109, 73, PP_CHARACTER}, - {PP_CHARACTER, 0, 112, 74, PP_CHARACTER}, - {PP_CHARACTER, 0, 108, 75, PP_CHARACTER}, + {PP_CHARACTER, 0, 109, 86, PP_CHARACTER}, + {PP_CHARACTER, 0, 112, 87, PP_CHARACTER}, + {PP_CHARACTER, 0, 108, 88, PP_CHARACTER}, {PP_TILDE, 0, 0, 0, PP_CHARACTER}, - {PP_NOT, 0, 61, 83, PP_NOTOKEN}, - {PP_CHARACTER, 0, 116, 78, PP_CHARACTER}, - {PP_NOT, 0, 95, 84, PP_CHARACTER}, + {PP_NOT, 0, 61, 96, PP_NOTOKEN}, + {PP_CHARACTER, 0, 116, 91, PP_CHARACTER}, + {PP_NOT, 0, 95, 97, PP_CHARACTER}, {PP_LTLT, 0, 0, 0, PP_NOTOKEN}, {PP_GTGT, 0, 0, 0, PP_NOTOKEN}, - {PP_INCOMPLETE, 0, 61, 82, PP_NOTOKEN}, + {PP_INCOMPLETE, 0, 61, 95, PP_NOTOKEN}, {PP_EQEQ, 0, 0, 0, PP_NOTOKEN}, {PP_NE, 0, 0, 0, PP_NOTOKEN}, - {PP_CHARACTER, 0, 101, 85, PP_CHARACTER}, - {PP_CHARACTER, 0, 113, 86, PP_CHARACTER}, + {PP_CHARACTER, 0, 101, 98, PP_CHARACTER}, + {PP_CHARACTER, 0, 113, 99, PP_CHARACTER}, {PP_NE, 0, 0, 0, PP_CHARACTER}, {PP_LE, 0, 0, 0, PP_NOTOKEN}, {PP_GE, 0, 0, 0, PP_NOTOKEN}, @@ -197,8 +210,8 @@ static const struct {PP_QUESTION, 0, 0, 0, PP_NOTOKEN}, {PP_COLON, 0, 0, 0, PP_NOTOKEN}, {PP_HASHHASH, 0, 0, 0, PP_NOTOKEN}, - {PP_INCOMPLETE, 0, 37, 95, PP_NOTOKEN}, - {PP_INCOMPLETE, 0, 58, 93, PP_NOTOKEN}, + {PP_INCOMPLETE, 0, 37, 108, PP_NOTOKEN}, + {PP_INCOMPLETE, 0, 58, 106, PP_NOTOKEN}, {PP_QUOTE, 0, 0, 0, PP_NOTOKEN}, {PP_SINGLEQUOTE, 0, 0, 0, PP_NOTOKEN}, {PP_WHITESPACE, 0, 0, 0, PP_NOTOKEN}, diff --git a/src/tools/moc/preprocessor.cpp b/src/tools/moc/preprocessor.cpp index 11ea8d417e2..721ee2bf519 100644 --- a/src/tools/moc/preprocessor.cpp +++ b/src/tools/moc/preprocessor.cpp @@ -706,17 +706,57 @@ void Preprocessor::substituteUntilNewline(Symbols &substituted) macroExpand(&substituted, this, symbols, index, symbol().lineNum, true); } else if (token == PP_DEFINED) { bool braces = test(PP_LPAREN); - next(PP_IDENTIFIER); - Symbol definedOrNotDefined = symbol(); - definedOrNotDefined.token = macros.contains(definedOrNotDefined)? PP_MOC_TRUE : PP_MOC_FALSE; - substituted += definedOrNotDefined; + if (test(PP_HAS_INCLUDE)) { + // __has_include is always supported + Symbol definedOrNotDefined = symbol(); + definedOrNotDefined.token = PP_MOC_TRUE; + substituted += definedOrNotDefined; + } else { + next(PP_IDENTIFIER); + Symbol definedOrNotDefined = symbol(); + definedOrNotDefined.token = macros.contains(definedOrNotDefined)? PP_MOC_TRUE : PP_MOC_FALSE; + substituted += definedOrNotDefined; + } if (braces) test(PP_RPAREN); continue; } else if (token == PP_NEWLINE) { substituted += symbol(); break; - } else { + } else if (token == PP_HAS_INCLUDE) { + next(LPAREN); + Token tok = next(); // quote or LANGLE + bool usesAngleInclude = false; + QByteArray includeAsString; + Symbols innerSymbols; + if (tok == PP_LANGLE) { + usesAngleInclude = true; + next(); + do { + Symbol currentSymbol = symbol(); + includeAsString += currentSymbol.lexem(); + if (currentSymbol.token == PP_IDENTIFIER) + macroExpand(&innerSymbols, this, symbols, index, symbol().lineNum, true); + else + innerSymbols.append(currentSymbol); + } while (next() != PP_RANGLE); + } else { + includeAsString = unquotedLexem(); + } + next(RPAREN); + const QByteArray &relative = usesAngleInclude ? QByteArray() : currentFilenames.top(); + bool result = !resolveInclude(includeAsString, relative).isNull(); + if (usesAngleInclude && !result) { + // try with expansion + includeAsString = {}; + for (const auto &innerSymbol: innerSymbols) + includeAsString.append(innerSymbol.lexem()); + result = !resolveInclude(includeAsString, relative).isNull(); + } + Symbol definedOrNotDefined = symbol(); + definedOrNotDefined.token = result ? PP_MOC_TRUE : PP_MOC_FALSE; + substituted += definedOrNotDefined; + } else { substituted += symbol(); } } diff --git a/src/tools/moc/token.h b/src/tools/moc/token.h index 95ef385a797..e07ff56892d 100644 --- a/src/tools/moc/token.h +++ b/src/tools/moc/token.h @@ -186,6 +186,7 @@ QT_BEGIN_NAMESPACE F(PP_ELSE) \ F(PP_ENDIF) \ F(PP_INCLUDE) \ + F(PP_HAS_INCLUDE) \ F(PP_HASHHASH) \ F(PP_HASH) \ F(PP_DEFINED) \ diff --git a/src/tools/moc/util/generate_keywords.cpp b/src/tools/moc/util/generate_keywords.cpp index b98914d7177..76e6707fe69 100644 --- a/src/tools/moc/util/generate_keywords.cpp +++ b/src/tools/moc/util/generate_keywords.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2016 The Qt Company Ltd. +// Copyright (C) 2016 TheQt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 #include #include @@ -27,6 +27,7 @@ static const Keyword pp_keywords[] = { { "#else", "PP_ELSE"}, { "#endif", "PP_ENDIF"}, { "#include", "PP_INCLUDE"}, + { "__has_include", "PP_HAS_INCLUDE"}, { "defined", "PP_DEFINED"}, { "+", "PP_PLUS" }, { "-", "PP_MINUS" }, diff --git a/tests/auto/tools/moc/tst_moc.cpp b/tests/auto/tools/moc/tst_moc.cpp index 42846cdfe5c..9c345093854 100644 --- a/tests/auto/tools/moc/tst_moc.cpp +++ b/tests/auto/tools/moc/tst_moc.cpp @@ -785,6 +785,7 @@ private slots: void initTestCase(); void dontStripNamespaces(); + void hasIncludeSupport(); void oldStyleCasts(); void faultyQmlRegistration_data(); void faultyQmlRegistration(); @@ -943,6 +944,18 @@ private: } while (false) +#ifdef __has_include +class HasIncludeTest { + Q_GADGET +# if __has_include() + Q_INVOKABLE void couldFindVector() {} +# endif +# if __has_include("using-namespaces.h") + Q_INVOKABLE void couldFindLocal() {} +# endif +}; +#endif + void tst_Moc::initTestCase() { QString binpath = QLibraryInfo::path(QLibraryInfo::BinariesPath); @@ -976,6 +989,14 @@ void tst_Moc::initTestCase() QVERIFY(TestPointeeCanBeIncomplete::staticMetaObject.className()); } +void tst_Moc::hasIncludeSupport() +{ + auto hasIncludeTestMo = &HasIncludeTest::staticMetaObject; + QVERIFY(hasIncludeTestMo->className()); + QVERIFY(hasIncludeTestMo->indexOfMethod("couldFindVector()") != -1); + QVERIFY(hasIncludeTestMo->indexOfMethod("couldFindLocal()") != -1); +} + void tst_Moc::dontStripNamespaces() { Sender sender;