From: Chris Lattner Date: Fri, 17 Apr 2009 23:56:52 +0000 (+0000) Subject: Fix two problems from PR3916, and one problem I noticed while hacking X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=9cb51ce03caf0755759f7e67aea7d4be684ff738;p=clang Fix two problems from PR3916, and one problem I noticed while hacking on the code. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@69404 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Lex/Lexer.cpp b/lib/Lex/Lexer.cpp index d04b1c2b69..490a0b5304 100644 --- a/lib/Lex/Lexer.cpp +++ b/lib/Lex/Lexer.cpp @@ -674,7 +674,7 @@ void Lexer::LexStringLiteral(Token &Result, const char *CurPtr, bool Wide) { /// after having lexed the '<' character. This is used for #include filenames. void Lexer::LexAngledStringLiteral(Token &Result, const char *CurPtr) { const char *NulCharacter = 0; // Does this string contain the \0 character? - + const char *AfterLessPos = CurPtr; char C = getAndAdvanceChar(CurPtr, Result); while (C != '>') { // Skip escaped characters. @@ -683,9 +683,9 @@ void Lexer::LexAngledStringLiteral(Token &Result, const char *CurPtr) { C = getAndAdvanceChar(CurPtr, Result); } else if (C == '\n' || C == '\r' || // Newline. (C == 0 && CurPtr-1 == BufferEnd)) { // End of file. - if (!isLexingRawMode() && !Features.AsmPreprocessor) - Diag(BufferPtr, diag::err_unterminated_angled_string); - FormTokenWithChars(Result, CurPtr-1, tok::unknown); + // If the filename is unterminated, then it must just be a lone < + // character. Return this as such. + FormTokenWithChars(Result, AfterLessPos, tok::less); return; } else if (C == 0) { NulCharacter = CurPtr-1; @@ -1635,7 +1635,7 @@ LexNextToken: case '<': Char = getCharAndSize(CurPtr, SizeTmp); if (ParsingFilename) { - return LexAngledStringLiteral(Result, CurPtr+SizeTmp); + return LexAngledStringLiteral(Result, CurPtr); } else if (Char == '<' && getCharAndSize(CurPtr+SizeTmp, SizeTmp2) == '=') { Kind = tok::lesslessequal; diff --git a/lib/Lex/PPDirectives.cpp b/lib/Lex/PPDirectives.cpp index 2dfb6233bd..502da73842 100644 --- a/lib/Lex/PPDirectives.cpp +++ b/lib/Lex/PPDirectives.cpp @@ -1066,8 +1066,11 @@ void Preprocessor::HandleIncludeDirective(Token &IncludeTok, return; } - // Verify that there is nothing after the filename, other than EOM. - CheckEndOfDirective(IncludeTok.getIdentifierInfo()->getName()); + // Verify that there is nothing after the filename, other than EOM. Note that + // we allow macros that expand to nothing after the filename, because this + // falls into the category of "#include pp-tokens new-line" specified in + // C99 6.10.2p4. + CheckEndOfDirective(IncludeTok.getIdentifierInfo()->getName(), true); // Check that we don't have infinite #include recursion. if (IncludeMacroStack.size() == MaxAllowedIncludeStackDepth-1) { diff --git a/test/Preprocessor/include-directive2.c b/test/Preprocessor/include-directive2.c index 785b77cbdd..123998246b 100644 --- a/test/Preprocessor/include-directive2.c +++ b/test/Preprocessor/include-directive2.c @@ -1,4 +1,17 @@ -// RUN: clang-cc -Eonly %s +// RUN: clang-cc -Eonly -verify %s # define HEADER # include HEADER + +#include NON_EMPTY // expected-warning {{extra tokens at end of #include directive}} + +// PR3916: these are ok. +#define EMPTY +#include EMPTY +#include HEADER EMPTY + +// PR3916 +#define FN limits.h> +#include // expected-error {{empty filename}}