diff options
-rw-r--r-- | Lex/Preprocessor.cpp | 16 | ||||
-rw-r--r-- | test/Preprocessor/function_macro_file.c | 5 | ||||
-rw-r--r-- | test/Preprocessor/function_macro_file.h | 3 |
3 files changed, 21 insertions, 3 deletions
diff --git a/Lex/Preprocessor.cpp b/Lex/Preprocessor.cpp index 93017937d5..bc7ad12e56 100644 --- a/Lex/Preprocessor.cpp +++ b/Lex/Preprocessor.cpp @@ -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; } } diff --git a/test/Preprocessor/function_macro_file.c b/test/Preprocessor/function_macro_file.c new file mode 100644 index 0000000000..eeb9256ec7 --- /dev/null +++ b/test/Preprocessor/function_macro_file.c @@ -0,0 +1,5 @@ +/* RUN: clang -E -P %s | grep f + */ + +#include "function_macro_file.h" +() diff --git a/test/Preprocessor/function_macro_file.h b/test/Preprocessor/function_macro_file.h new file mode 100644 index 0000000000..43d1199bfe --- /dev/null +++ b/test/Preprocessor/function_macro_file.h @@ -0,0 +1,3 @@ + +#define f() x +f |