From 21db4b338b938e0a447a1242647e213aabaad02d Mon Sep 17 00:00:00 2001 From: Enzo Date: Tue, 20 Oct 2020 21:57:24 +0200 Subject: [PATCH] parser: clean error when nesting `unsafe` (#6656) --- vlib/v/parser/parser.v | 4 +++- vlib/v/parser/pratt.v | 6 ++++-- vlib/v/parser/tests/nested_unsafe_expr.out | 7 +++++++ vlib/v/parser/tests/nested_unsafe_expr.vv | 7 +++++++ vlib/v/parser/tests/nested_unsafe_stmt.out | 7 +++++++ vlib/v/parser/tests/nested_unsafe_stmt.vv | 9 +++++++++ 6 files changed, 37 insertions(+), 3 deletions(-) create mode 100644 vlib/v/parser/tests/nested_unsafe_expr.out create mode 100644 vlib/v/parser/tests/nested_unsafe_expr.vv create mode 100644 vlib/v/parser/tests/nested_unsafe_stmt.out create mode 100644 vlib/v/parser/tests/nested_unsafe_stmt.vv diff --git a/vlib/v/parser/parser.v b/vlib/v/parser/parser.v index 5c095738b..8397dff3c 100644 --- a/vlib/v/parser/parser.v +++ b/vlib/v/parser/parser.v @@ -2012,7 +2012,9 @@ fn (mut p Parser) unsafe_stmt() ast.Stmt { p.error_with_pos('please use `unsafe {`', p.tok.position()) } p.next() - assert !p.inside_unsafe + if p.inside_unsafe { + p.error_with_pos('already inside `unsafe` block', pos) + } if p.tok.kind == .rcbr { // `unsafe {}` p.next() diff --git a/vlib/v/parser/pratt.v b/vlib/v/parser/pratt.v index dd65d279f..bcf5c2cb9 100644 --- a/vlib/v/parser/pratt.v +++ b/vlib/v/parser/pratt.v @@ -92,9 +92,11 @@ pub fn (mut p Parser) expr(precedence int) ast.Expr { } .key_unsafe { // unsafe { - p.next() pos := p.tok.position() - assert !p.inside_unsafe + p.next() + if p.inside_unsafe { + p.error_with_pos('already inside `unsafe` block', pos) + } p.inside_unsafe = true p.check(.lcbr) node = ast.UnsafeExpr{ diff --git a/vlib/v/parser/tests/nested_unsafe_expr.out b/vlib/v/parser/tests/nested_unsafe_expr.out new file mode 100644 index 000000000..1d815ed8b --- /dev/null +++ b/vlib/v/parser/tests/nested_unsafe_expr.out @@ -0,0 +1,7 @@ +vlib/v/parser/tests/nested_unsafe_expr.vv:4:8: error: already inside `unsafe` block + 2 | a := 0 + 3 | unsafe { + 4 | a += unsafe{2} + | ~~~~~~ + 5 | } + 6 | println(a) diff --git a/vlib/v/parser/tests/nested_unsafe_expr.vv b/vlib/v/parser/tests/nested_unsafe_expr.vv new file mode 100644 index 000000000..1ab098cea --- /dev/null +++ b/vlib/v/parser/tests/nested_unsafe_expr.vv @@ -0,0 +1,7 @@ +fn main() { + a := 0 + unsafe { + a += unsafe{2} + } + println(a) +} diff --git a/vlib/v/parser/tests/nested_unsafe_stmt.out b/vlib/v/parser/tests/nested_unsafe_stmt.out new file mode 100644 index 000000000..b76a6e5bb --- /dev/null +++ b/vlib/v/parser/tests/nested_unsafe_stmt.out @@ -0,0 +1,7 @@ +vlib/v/parser/tests/nested_unsafe_stmt.vv:4:3: error: already inside `unsafe` block + 2 | a := 0 + 3 | unsafe { + 4 | unsafe { + | ~~~~~~ + 5 | a++ + 6 | } diff --git a/vlib/v/parser/tests/nested_unsafe_stmt.vv b/vlib/v/parser/tests/nested_unsafe_stmt.vv new file mode 100644 index 000000000..283e76dab --- /dev/null +++ b/vlib/v/parser/tests/nested_unsafe_stmt.vv @@ -0,0 +1,9 @@ +fn main() { + a := 0 + unsafe { + unsafe { + a++ + } + } + println(a) +} -- 2.39.5