]> granicus.if.org Git - clang/commitdiff
Fix PR3917: the location of a #line directive is the location of the first _.
authorChris Lattner <sabre@nondot.org>
Sat, 18 Apr 2009 22:29:33 +0000 (22:29 +0000)
committerChris Lattner <sabre@nondot.org>
Sat, 18 Apr 2009 22:29:33 +0000 (22:29 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@69485 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Lex/PPMacroExpansion.cpp
test/Preprocessor/line-directive.c

index 7e695a542b0d84d9c93abf0e60c1b016484214b0..330e2a17aa39c55aa75da1d57a5984adc6e24d58 100644 (file)
@@ -485,6 +485,10 @@ void Preprocessor::ExpandBuiltinMacro(Token &Tok) {
     // be affected by #line.
     SourceLocation Loc = Tok.getLocation();
     
+    // Advance to the location of the first _, this might not be the first byte
+    // of the token if it starts with an escaped newline.
+    Loc = AdvanceToTokenCharacter(Loc, 0);
+    
     // One wrinkle here is that GCC expands __LINE__ to location of the *end* of
     // a macro instantiation.  This doesn't matter for object-like macros, but
     // can matter for a function-like macro that expands to contain __LINE__.
index 04c69a6791adcc19bf3fe29e4dbef647266dfce8..a9ed4bcf8cd66f99d55d890b905964114dead3c3 100644 (file)
@@ -79,3 +79,11 @@ typedef int w;  // expected-error {{redefinition of typedef 'w' is invalid in C}
 #line 010  // expected-warning {{#line directive interprets number as decimal, not octal}}
 extern int array[__LINE__ == 10 ? 1:-1];
 
+/* PR3917 */
+#line 41
+extern char array2[\
+_\
+_LINE__ == 42 ? 1: -1];  /* line marker is location of first _ */
+
+
+