summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorErich Keane <erich.keane@intel.com>2017-08-24 18:36:07 +0000
committerErich Keane <erich.keane@intel.com>2017-08-24 18:36:07 +0000
commit5a2b322e0d27e6c0184fe8e835e4c1d33003f5c9 (patch)
tree243790b7f2f125a4119fb0d10023379b262ee654
parent5c19028cec6567e196a7c5990ad644e2e6a483fb (diff)
downloadbcm5719-llvm-5a2b322e0d27e6c0184fe8e835e4c1d33003f5c9.tar.gz
bcm5719-llvm-5a2b322e0d27e6c0184fe8e835e4c1d33003f5c9.zip
[Preprocessor] Correct internal token parsing of newline characters in CRLF
Discovered due to a goofy git setup, the test system-headerline-directive.c (and a few others) failed because the token-consumption will consume only the '\r' in CRLF, making the preprocessor's printed value give the wrong line number when returning from an include. For example: (line 1):#include <noline.h>\r\n The "file exit" code causes the printer to try to print the 'returned to the main file' line. It looks up what the current line number is. However, since the current 'token' is the '\n' (since only the \r was consumed), it will give the line number as '1", not '2'. This results in a few failed tests, but more importantly, results in error messages being incorrect when compiling a previously preprocessed file. Differential Revision: https://reviews.llvm.org/D37079 llvm-svn: 311683
-rw-r--r--clang/lib/Lex/Lexer.cpp2
-rw-r--r--clang/test/Frontend/.gitattributes2
-rw-r--r--clang/test/Frontend/system-header-line-directive-ms-lineendings.c21
3 files changed, 25 insertions, 0 deletions
diff --git a/clang/lib/Lex/Lexer.cpp b/clang/lib/Lex/Lexer.cpp
index 79472961c01..976a0d2fbd8 100644
--- a/clang/lib/Lex/Lexer.cpp
+++ b/clang/lib/Lex/Lexer.cpp
@@ -3073,6 +3073,8 @@ LexNextToken:
case '\n':
case '\r':
+ if (CurPtr[0] != Char && (CurPtr[0] == '\n' || CurPtr[0] == '\r'))
+ Char = getAndAdvanceChar(CurPtr, Result);
// If we are inside a preprocessor directive and we see the end of line,
// we know we are done with the directive, so return an EOD token.
if (ParsingPreprocessorDirective) {
diff --git a/clang/test/Frontend/.gitattributes b/clang/test/Frontend/.gitattributes
new file mode 100644
index 00000000000..03f5ad0e0cb
--- /dev/null
+++ b/clang/test/Frontend/.gitattributes
@@ -0,0 +1,2 @@
+# Below test validates crlf line endings, so it should stay crlf.
+system-header-line-directive-ms-lineendings.c text eol=crlf
diff --git a/clang/test/Frontend/system-header-line-directive-ms-lineendings.c b/clang/test/Frontend/system-header-line-directive-ms-lineendings.c
new file mode 100644
index 00000000000..34a7ec94b03
--- /dev/null
+++ b/clang/test/Frontend/system-header-line-directive-ms-lineendings.c
@@ -0,0 +1,21 @@
+// RUN: %clang_cc1 %s -E -o - -I %S/Inputs -isystem %S/Inputs/SystemHeaderPrefix | FileCheck %s
+#include <noline.h>
+#include <line-directive-in-system.h>
+
+#include "line-directive.h"
+
+// This tests that the line numbers for the current file are correctly outputted
+// for the include-file-completed test case.
+
+// CHECK: # 1 "{{.*}}system-header-line-directive-ms-lineendings.c" 2
+// CHECK: # 1 "{{.*}}noline.h" 1 3
+// CHECK: foo();
+// CHECK: # 3 "{{.*}}system-header-line-directive-ms-lineendings.c" 2
+// CHECK: # 1 "{{.*}}line-directive-in-system.h" 1 3
+// The "3" below indicates that "foo.h" is considered a system header.
+// CHECK: # 1 "foo.h" 3
+// CHECK: foo();
+// CHECK: # 4 "{{.*}}system-header-line-directive-ms-lineendings.c" 2
+// CHECK: # 1 "{{.*}}line-directive.h" 1
+// CHECK: # 10 "foo.h"{{$}}
+// CHECK: # 6 "{{.*}}system-header-line-directive-ms-lineendings.c" 2
OpenPOWER on IntegriCloud