summaryrefslogtreecommitdiff
path: root/src/libs/cplusplus/pp-engine.cpp
diff options
context:
space:
mode:
authorEike Ziller <eike.ziller@qt.io>2019-01-17 12:04:35 +0100
committerEike Ziller <eike.ziller@qt.io>2019-01-17 12:04:35 +0100
commit413c5c3b8a6479e0240d9f89bdc1086911659a88 (patch)
tree941219b2e7af83ff7c610cdbe6c16f337428e3fd /src/libs/cplusplus/pp-engine.cpp
parenteb9e8e128bf77de1dcb8f0476b90a6e6db845278 (diff)
parent9d5b42067ebc1e9252391d17d3546b025569d735 (diff)
downloadqt-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.cpp34
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;