diff options
| author | Eike Ziller <eike.ziller@qt.io> | 2019-01-17 12:04:35 +0100 |
|---|---|---|
| committer | Eike Ziller <eike.ziller@qt.io> | 2019-01-17 12:04:35 +0100 |
| commit | 413c5c3b8a6479e0240d9f89bdc1086911659a88 (patch) | |
| tree | 941219b2e7af83ff7c610cdbe6c16f337428e3fd /src/libs/cplusplus/pp-engine.cpp | |
| parent | eb9e8e128bf77de1dcb8f0476b90a6e6db845278 (diff) | |
| parent | 9d5b42067ebc1e9252391d17d3546b025569d735 (diff) | |
| download | qt-creator-413c5c3b8a6479e0240d9f89bdc1086911659a88.tar.gz | |
Merge remote-tracking branch 'origin/4.8'
Change-Id: I400217ba1c8a531e0450c3012a07db3fc93638cf
Diffstat (limited to 'src/libs/cplusplus/pp-engine.cpp')
| -rw-r--r-- | src/libs/cplusplus/pp-engine.cpp | 34 |
1 files changed, 24 insertions, 10 deletions
diff --git a/src/libs/cplusplus/pp-engine.cpp b/src/libs/cplusplus/pp-engine.cpp index 6ed0bff9ac..a4bfea10b4 100644 --- a/src/libs/cplusplus/pp-engine.cpp +++ b/src/libs/cplusplus/pp-engine.cpp @@ -52,6 +52,7 @@ #include <cplusplus/Literals.h> #include <cplusplus/cppassert.h> +#include <utils/executeondestruction.h> #include <utils/scopedswap.h> #include <QDebug> @@ -161,6 +162,7 @@ namespace Internal { struct TokenBuffer { std::deque<PPToken> tokens; + std::vector<QByteArray> blockedMacroNames; const Macro *macro; TokenBuffer *next; @@ -172,10 +174,14 @@ struct TokenBuffer if (!macro) return false; - for (const TokenBuffer *it = this; it; it = it->next) - if (it->macro) - if (it->macro == macro || (it->macro->name() == macro->name())) - return true; + for (const TokenBuffer *it = this; it; it = it->next) { + if (it->macro && (it->macro == macro || it->macro->name() == macro->name())) + return true; + } + for (const QByteArray &blockedMacroName : blockedMacroNames) { + if (macro->name() == blockedMacroName) + return true; + } return false; } }; @@ -956,9 +962,7 @@ bool Preprocessor::handleIdentifier(PPToken *tk) Macro *macro = m_env->resolve(macroNameRef); if (!macro - || (tk->expanded() - && m_state.m_tokenBuffer - && m_state.m_tokenBuffer->isBlocked(macro))) { + || (tk->expanded() && m_state.m_tokenBuffer && m_state.m_tokenBuffer->isBlocked(macro))) { return false; } // qDebug() << "expanding" << macro->name() << "on line" << tk->lineno; @@ -991,7 +995,7 @@ bool Preprocessor::handleIdentifier(PPToken *tk) // Collect individual tokens that form the macro arguments. QVector<QVector<PPToken> > allArgTks; - bool hasArgs = collectActualArguments(tk, &allArgTks); + bool hasArgs = collectActualArguments(tk, &allArgTks, macro->name()); // Check whether collecting arguments failed due to a previously added marker // that goot nested in a sequence of expansions. If so, store it and try again. @@ -1001,7 +1005,7 @@ bool Preprocessor::handleIdentifier(PPToken *tk) && (m_state.m_expansionStatus == Expanding || m_state.m_expansionStatus == ReadyForExpansion)) { oldMarkerTk = *tk; - hasArgs = collectActualArguments(tk, &allArgTks); + hasArgs = collectActualArguments(tk, &allArgTks, macro->name()); } // Check for matching parameter/argument count. @@ -1498,11 +1502,21 @@ bool Preprocessor::consumeComments(PPToken *tk) return tk->isNot(T_EOF_SYMBOL); } -bool Preprocessor::collectActualArguments(PPToken *tk, QVector<QVector<PPToken> > *actuals) +bool Preprocessor::collectActualArguments(PPToken *tk, QVector<QVector<PPToken> > *actuals, + const QByteArray &parentMacroName) { Q_ASSERT(tk); Q_ASSERT(actuals); + ExecuteOnDestruction removeBlockedName; + if (m_state.m_tokenBuffer) { + removeBlockedName.reset([this] { + if (m_state.m_tokenBuffer && !m_state.m_tokenBuffer->blockedMacroNames.empty()) + m_state.m_tokenBuffer->blockedMacroNames.pop_back(); + }); + m_state.m_tokenBuffer->blockedMacroNames.push_back(parentMacroName); + } + lex(tk); // consume the identifier bool lastCommentIsCpp = false; |
