diff options
| author | Orgad Shaneh <[email protected]> | 2014-02-06 23:18:18 +0200 |
|---|---|---|
| committer | Orgad Shaneh <[email protected]> | 2014-02-27 16:13:51 +0100 |
| commit | 5d2cd2e56d507623a2970e91afacd2c26f458714 (patch) | |
| tree | 935e405e9bdf2894f4b51ae9abbe21661f0fc1e1 /src/libs/cplusplus/pp-engine.cpp | |
| parent | 8ff63de72802af6111530fab834421b492c97137 (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.cpp | 13 |
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 { |
