aboutsummaryrefslogtreecommitdiffstats
path: root/src/libs/cplusplus/pp-engine.cpp
diff options
context:
space:
mode:
authorOrgad Shaneh <[email protected]>2014-02-06 23:18:18 +0200
committerOrgad Shaneh <[email protected]>2014-02-27 16:13:51 +0100
commit5d2cd2e56d507623a2970e91afacd2c26f458714 (patch)
tree935e405e9bdf2894f4b51ae9abbe21661f0fc1e1 /src/libs/cplusplus/pp-engine.cpp
parent8ff63de72802af6111530fab834421b492c97137 (diff)
C++: Fix handling of #undef
* If the macro is defined before, track its reference * Synchronize environment line before calling remove, which currently sets incorrect line * Set macro offset Task-number: QTCREATORBUG-10454 Change-Id: I480d16423a976a025bb8c71046610a46f9d7b0fd Reviewed-by: Nikolai Kosjar <[email protected]>
Diffstat (limited to 'src/libs/cplusplus/pp-engine.cpp')
-rw-r--r--src/libs/cplusplus/pp-engine.cpp13
1 files changed, 11 insertions, 2 deletions
diff --git a/src/libs/cplusplus/pp-engine.cpp b/src/libs/cplusplus/pp-engine.cpp
index 21440bc86c1..41439ad7904 100644
--- a/src/libs/cplusplus/pp-engine.cpp
+++ b/src/libs/cplusplus/pp-engine.cpp
@@ -1951,10 +1951,19 @@ void Preprocessor::handleUndefDirective(PPToken *tk)
lex(tk); // consume "undef" token
if (tk->is(T_IDENTIFIER)) {
const ByteArrayRef macroName = tk->asByteArrayRef();
- const Macro *macro = m_env->remove(macroName);
+ const unsigned offset = tk->offset + m_state.m_offsetRef;
+ // Track macro use if previously defined
+ if (m_client) {
+ if (const Macro *existingMacro = m_env->resolve(macroName))
+ m_client->notifyMacroReference(offset, tk->lineno, *existingMacro);
+ }
+ synchronizeOutputLines(*tk);
+ Macro *macro = m_env->remove(macroName);
- if (m_client && macro)
+ if (m_client && macro) {
+ macro->setOffset(offset);
m_client->macroAdded(*macro);
+ }
lex(tk); // consume macro name
#ifndef NO_DEBUG
} else {