diff --git a/src/libs/cplusplus/pp-engine.cpp b/src/libs/cplusplus/pp-engine.cpp index 83b0d4191c8a7242ea04e4aa0523ce5196de0f2e..c9295c94248f0c7571b38787c88e4057d0a6395f 100644 --- a/src/libs/cplusplus/pp-engine.cpp +++ b/src/libs/cplusplus/pp-engine.cpp @@ -748,34 +748,11 @@ void Preprocessor::preprocess(const QByteArray &fileName, const QByteArray &sour else { if (! m->isFunctionLike()) { - QByteArray tmp; - expandObjectLikeMacro(identifierToken, spell, m, &tmp); - - if (_dot->isNot(T_LPAREN)) { - _result->append(tmp); + if (0 == (m = processObjectLikeMacro(identifierToken, spell, m))) continue; - } else { - m = 0; // reset the active the macro - - pushState(createStateFromSource(tmp)); - - if (_dot->is(T_IDENTIFIER)) { - const QByteArray id = tokenSpell(*_dot); - - if (Macro *macro = env->resolve(id)) { - if (macro->isFunctionLike()) - m = macro; - } - } - - popState(); - - if (! m) { - _result->append(tmp); - continue; - } - } + // the macro expansion generated something that looks like + // a function-like macro. } // `m' is function-like macro. @@ -817,6 +794,39 @@ void Preprocessor::preprocess(const QByteArray &fileName, const QByteArray &sour _result = previousResult; } +Macro *Preprocessor::processObjectLikeMacro(TokenIterator identifierToken, + const QByteArray &spell, + Macro *m) +{ + QByteArray tmp; + expandObjectLikeMacro(identifierToken, spell, m, &tmp); + + if (_dot->is(T_LPAREN)) { + // check if the expension generated a function-like macro. + + m = 0; // reset the active the macro + + pushState(createStateFromSource(tmp)); + + if (_dot->is(T_IDENTIFIER)) { + const QByteArray id = tokenSpell(*_dot); + + if (Macro *macro = env->resolve(id)) { + if (macro->isFunctionLike()) + m = macro; + } + } + + popState(); + + if (m != 0) + return m; + } + + _result->append(tmp); + return 0; +} + void Preprocessor::expandObjectLikeMacro(TokenIterator identifierToken, const QByteArray &spell, Macro *m, diff --git a/src/libs/cplusplus/pp-engine.h b/src/libs/cplusplus/pp-engine.h index 9fc2d49a27679630128601501f8af277df2c6597..c66517e2495b64bfec659bfdfd26559eda566ea3 100644 --- a/src/libs/cplusplus/pp-engine.h +++ b/src/libs/cplusplus/pp-engine.h @@ -128,9 +128,14 @@ private: QByteArray tokenText(const CPlusPlus::Token &token) const; // does a deep copy void processNewline(); + void processSkippingBlocks(bool skippingBlocks, TokenIterator dot, TokenIterator lastToken); + Macro *processObjectLikeMacro(TokenIterator identifierToken, + const QByteArray &spell, + Macro *m); + void processDirective(TokenIterator dot, TokenIterator lastToken); void processInclude(bool skipCurrentPath, TokenIterator dot, TokenIterator lastToken,