Correctly respect C99 5.1.1.2p4 when searching for the first '(' of

a function-like macro invocation.  Patch contributed by Neil Booth.


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@40026 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Chris Lattner 2007-07-19 00:07:36 +00:00
parent 76e773a443
commit 0ea793e5e3
3 changed files with 21 additions and 3 deletions

View File

@ -554,14 +554,24 @@ bool Preprocessor::isNextPPTokenLParen() {
Val = CurMacroExpander->isNextTokenLParen();
if (Val == 2) {
// If we ran off the end of the lexer or macro expander, walk the include
// stack, looking for whatever will return the next token.
for (unsigned i = IncludeMacroStack.size(); Val == 2 && i != 0; --i) {
// We have run off the end. If it's a source file we don't
// examine enclosing ones (C99 5.1.1.2p4). Otherwise walk up the
// macro stack.
if (CurLexer)
return false;
for (unsigned i = IncludeMacroStack.size(); i != 0; --i) {
IncludeStackInfo &Entry = IncludeMacroStack[i-1];
if (Entry.TheLexer)
Val = Entry.TheLexer->isNextPPTokenLParen();
else
Val = Entry.TheMacroExpander->isNextTokenLParen();
if (Val != 2)
break;
// Ran off the end of a source file?
if (Entry.TheLexer)
return false;
}
}

View File

@ -0,0 +1,5 @@
/* RUN: clang -E -P %s | grep f
*/
#include "function_macro_file.h"
()

View File

@ -0,0 +1,3 @@
#define f() x
f