From d72229ff2c53adcf4b900846eb4c50b5cd13c989 Mon Sep 17 00:00:00 2001 From: yuyi Date: Mon, 14 Aug 2023 11:21:51 +0800 Subject: [PATCH] scanner: error early on an unsupported escape sequence in a string, like `\_` (fix #19131) (#19134) --- vlib/v/scanner/scanner.v | 5 +++++ vlib/v/scanner/tests/unknown_escape_sequence_err.out | 5 +++++ vlib/v/scanner/tests/unknown_escape_sequence_err.vv | 3 +++ 3 files changed, 13 insertions(+) create mode 100644 vlib/v/scanner/tests/unknown_escape_sequence_err.out create mode 100644 vlib/v/scanner/tests/unknown_escape_sequence_err.vv diff --git a/vlib/v/scanner/scanner.v b/vlib/v/scanner/scanner.v index 6a102d439..2b96bfaae 100644 --- a/vlib/v/scanner/scanner.v +++ b/vlib/v/scanner/scanner.v @@ -1234,6 +1234,11 @@ fn (mut s Scanner) ident_string() string { } u_escapes_pos << s.pos - 1 } + // Unknown escape sequence + if c !in [`x`, `u`, `e`, `n`, `r`, `t`, `v`, `a`, `f`, `b`, `\\`, `\``, `$`, `@`, `?`, `{`, `}`, `'`, `"`] + && !c.is_digit() { + s.error('`${c.ascii_str()}` unknown escape sequence') + } } // ${var} (ignore in vfmt mode) (skip \$) if prevc == `$` && c == `{` && !is_raw diff --git a/vlib/v/scanner/tests/unknown_escape_sequence_err.out b/vlib/v/scanner/tests/unknown_escape_sequence_err.out new file mode 100644 index 000000000..eef4301d3 --- /dev/null +++ b/vlib/v/scanner/tests/unknown_escape_sequence_err.out @@ -0,0 +1,5 @@ +vlib/v/scanner/tests/unknown_escape_sequence_err.vv:2:14: error: `_` unknown escape sequence + 1 | fn main() { + 2 | println('¯\_(ツ)_/¯') + | ^ + 3 | } diff --git a/vlib/v/scanner/tests/unknown_escape_sequence_err.vv b/vlib/v/scanner/tests/unknown_escape_sequence_err.vv new file mode 100644 index 000000000..1e1a8af0f --- /dev/null +++ b/vlib/v/scanner/tests/unknown_escape_sequence_err.vv @@ -0,0 +1,3 @@ +fn main() { + println('¯\_(ツ)_/¯') +} -- 2.39.5