From a0ebdbc089aa9a1c88077abc37e62c74ac30160b Mon Sep 17 00:00:00 2001 From: Rintaro Ishizaki Date: Sat, 22 Sep 2018 02:09:19 +0900 Subject: [PATCH] [Lexer] Fix assertion failure for unterminated string literal in string interpolation in multiline string literal. """ \("<-this is unterminated. """ In this case, the outer multiline literal should form 'tok::unknown' along with a error message. --- lib/Parse/Lexer.cpp | 6 ++++++ test/Parse/multiline_errors.swift | 7 +++++++ test/Parse/string_literal_eof4.swift | 6 ++++++ test/Parse/string_literal_eof5.swift | 7 +++++++ test/Parse/string_literal_eof6.swift | 7 +++++++ test/Parse/string_literal_eof7.swift | 9 +++++++++ 6 files changed, 42 insertions(+) create mode 100644 test/Parse/string_literal_eof4.swift create mode 100644 test/Parse/string_literal_eof5.swift create mode 100644 test/Parse/string_literal_eof6.swift create mode 100644 test/Parse/string_literal_eof7.swift diff --git a/lib/Parse/Lexer.cpp b/lib/Parse/Lexer.cpp index b614aa01c5c6e..c09b28847d363 100644 --- a/lib/Parse/Lexer.cpp +++ b/lib/Parse/Lexer.cpp @@ -1817,6 +1817,12 @@ void Lexer::lexStringLiteral(unsigned CustomDelimiterLen) { // Successfully scanned the body of the expression literal. ++CurPtr; continue; + } else if ((*CurPtr == '\r' || *CurPtr == '\n') && IsMultilineString) { + // The only case we reach here is unterminated single line string in the + // interpolation. For better recovery, go on after emitting an error. + diagnose(CurPtr, diag::lex_unterminated_string); + wasErroneous = true; + continue; } // Being diagnosed below. diff --git a/test/Parse/multiline_errors.swift b/test/Parse/multiline_errors.swift index 4fa56d09cc8d3..de5c3cdaaa38c 100644 --- a/test/Parse/multiline_errors.swift +++ b/test/Parse/multiline_errors.swift @@ -184,3 +184,10 @@ _ = """\ // FIXME: Bad diagnostics // expected-error@-3 {{multi-line string literal content must begin on a new line}} // expected-error@-4 {{escaped newline at the last line is not allowed}} {{8-9=}} + +let _ = """ + foo + \("bar + baz + """ + // expected-error@-3 {{unterminated string literal}} diff --git a/test/Parse/string_literal_eof4.swift b/test/Parse/string_literal_eof4.swift new file mode 100644 index 0000000000000..2f8f45139ee06 --- /dev/null +++ b/test/Parse/string_literal_eof4.swift @@ -0,0 +1,6 @@ +// RUN: %target-typecheck-verify-swift + +// NOTE: DO NOT add a newline at EOF. +// expected-error@+1 {{unterminated string literal}} +_ = """ + foo \ No newline at end of file diff --git a/test/Parse/string_literal_eof5.swift b/test/Parse/string_literal_eof5.swift new file mode 100644 index 0000000000000..04c359abab47e --- /dev/null +++ b/test/Parse/string_literal_eof5.swift @@ -0,0 +1,7 @@ +// RUN: %target-typecheck-verify-swift + +// NOTE: DO NOT add a newline at EOF. +// expected-error@+1 {{unterminated string literal}} +_ = """ + foo + \( diff --git a/test/Parse/string_literal_eof6.swift b/test/Parse/string_literal_eof6.swift new file mode 100644 index 0000000000000..43611f4f6ffa9 --- /dev/null +++ b/test/Parse/string_literal_eof6.swift @@ -0,0 +1,7 @@ +// RUN: %target-typecheck-verify-swift + +// NOTE: DO NOT add a newline at EOF. +// expected-error@+1 {{unterminated string literal}} +_ = """ + foo + \("bar \ No newline at end of file diff --git a/test/Parse/string_literal_eof7.swift b/test/Parse/string_literal_eof7.swift new file mode 100644 index 0000000000000..8525270a45c7c --- /dev/null +++ b/test/Parse/string_literal_eof7.swift @@ -0,0 +1,9 @@ +// RUN: %target-typecheck-verify-swift + +// expected-error@+4 {{unterminated string literal}} +// expected-error@+1 {{unterminated string literal}} +_ = """ + foo + \("bar + baz +