summaryrefslogtreecommitdiffstats
path: root/clang
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2009-04-17 23:56:52 +0000
committerChris Lattner <sabre@nondot.org>2009-04-17 23:56:52 +0000
commitb40289b2b8453e22869928540c2978d8ffd6d74e (patch)
treeb70f761856dbaaf9e95a450eb22ee22928a69b64 /clang
parentca556cb3e3658637fc1eb3ff68bf348041ac959d (diff)
downloadbcm5719-llvm-b40289b2b8453e22869928540c2978d8ffd6d74e.tar.gz
bcm5719-llvm-b40289b2b8453e22869928540c2978d8ffd6d74e.zip
Fix two problems from PR3916, and one problem I noticed while hacking
on the code. llvm-svn: 69404
Diffstat (limited to 'clang')
-rw-r--r--clang/lib/Lex/Lexer.cpp10
-rw-r--r--clang/lib/Lex/PPDirectives.cpp7
-rw-r--r--clang/test/Preprocessor/include-directive2.c15
3 files changed, 24 insertions, 8 deletions
diff --git a/clang/lib/Lex/Lexer.cpp b/clang/lib/Lex/Lexer.cpp
index d04b1c2b69e..490a0b53049 100644
--- a/clang/lib/Lex/Lexer.cpp
+++ b/clang/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/clang/lib/Lex/PPDirectives.cpp b/clang/lib/Lex/PPDirectives.cpp
index 2dfb6233bdf..502da738425 100644
--- a/clang/lib/Lex/PPDirectives.cpp
+++ b/clang/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/clang/test/Preprocessor/include-directive2.c b/clang/test/Preprocessor/include-directive2.c
index 785b77cbdd8..123998246bf 100644
--- a/clang/test/Preprocessor/include-directive2.c
+++ b/clang/test/Preprocessor/include-directive2.c
@@ -1,4 +1,17 @@
-// RUN: clang-cc -Eonly %s
+// RUN: clang-cc -Eonly -verify %s
# define HEADER <float.h>
# include HEADER
+
+#include <limits.h> NON_EMPTY // expected-warning {{extra tokens at end of #include directive}}
+
+// PR3916: these are ok.
+#define EMPTY
+#include <limits.h> EMPTY
+#include HEADER EMPTY
+
+// PR3916
+#define FN limits.h>
+#include <FN
+
+#include <> // expected-error {{empty filename}}
OpenPOWER on IntegriCloud