[PATCH] D52855: Fix source loc for tokens that immediately follow an escaped newline

Brad Moody via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Wed Oct 3 17:24:47 PDT 2018


bmoody created this revision.
bmoody added a reviewer: rsmith.
Herald added a subscriber: cfe-commits.

Previously the location of a token immediately following an escaped newline was the location of the backslash character in the escaped newline.

The change to test/SemaTemplate/instantiation-depth.cpp is to work around a side-effect of this fix - the expected-error comment was getting the location of the backslash on the previous line before. I added the extra slashes so that the comment starts on the correct line.


Repository:
  rC Clang

https://reviews.llvm.org/D52855

Files:
  lib/Lex/Lexer.cpp
  test/Misc/escaped-newline-loc.c
  test/SemaTemplate/instantiation-depth.cpp


Index: test/SemaTemplate/instantiation-depth.cpp
===================================================================
--- test/SemaTemplate/instantiation-depth.cpp
+++ test/SemaTemplate/instantiation-depth.cpp
@@ -4,7 +4,7 @@
 
 #ifndef NOEXCEPT
 
-template<typename T> struct X : X<T*> { }; \
+template<typename T> struct X : X<T*> { }; // \
 // expected-error{{recursive template instantiation exceeded maximum depth of 5}} \
 // expected-note 3 {{instantiation of template class}} \
 // expected-note {{skipping 2 contexts in backtrace}} \
@@ -19,7 +19,7 @@
 // RUN: %clang_cc1 -fsyntax-only -verify -ftemplate-depth 5 -ftemplate-backtrace-limit 4 -std=c++11 -DNOEXCEPT %s
 
 template<typename T> struct S {
-  S() noexcept(noexcept(S<S>())); \
+  S() noexcept(noexcept(S<S>())); // \
 // expected-error{{recursive template instantiation exceeded maximum depth of 5}} \
 // expected-note 3 {{in instantiation of exception spec}} \
 // expected-note {{skipping 2 contexts in backtrace}} \
Index: test/Misc/escaped-newline-loc.c
===================================================================
--- /dev/null
+++ test/Misc/escaped-newline-loc.c
@@ -0,0 +1,17 @@
+// RUN: %clang_cc1 %s -fsyntax-only -verify -Wno-backslash-newline-escape
+
+// Test that the location of a token that immediately follows an escaped
+// newline is correct, and doesn't point to the backslash
+
+void f() {
+  \
+error1; // expected-error {{use of undeclared identifier 'error1'}}
+
+  // Escaped newline with space
+  \ 
+error2; // expected-error {{use of undeclared identifier 'error2'}}
+
+  // Escaped newline with two spaces
+  \  
+error3; // expected-error {{use of undeclared identifier 'error3'}}
+}
Index: lib/Lex/Lexer.cpp
===================================================================
--- lib/Lex/Lexer.cpp
+++ lib/Lex/Lexer.cpp
@@ -3193,6 +3193,17 @@
 
   // Read a character, advancing over it.
   char Char = getAndAdvanceChar(CurPtr, Result);
+
+  // If we had to skip over an escaped newline to get this character then
+  // update BufferPtr to point to the character we got, instead of pointing
+  // at the backslash. This fixes the source location for tokens that
+  // immediately follow an escaped newline.
+  if (!isKeepWhitespaceMode() &&
+      Result.needsCleaning() && CurPtr[-1] == Char) {
+    Result.clearFlag(Token::NeedsCleaning);
+    BufferPtr = CurPtr - 1;
+  }
+
   tok::TokenKind Kind;
 
   switch (Char) {


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D52855.168213.patch
Type: text/x-patch
Size: 2431 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20181004/e3ca1e6f/attachment.bin>


More information about the cfe-commits mailing list