diff --git a/vlib/v/parser/parser.v b/vlib/v/parser/parser.v index 5c095738b2..8397dff3c7 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 dd65d279f5..bcf5c2cb9c 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 0000000000..1d815ed8bd --- /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 0000000000..1ab098ceae --- /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 0000000000..b76a6e5bb1 --- /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 0000000000..283e76dab0 --- /dev/null +++ b/vlib/v/parser/tests/nested_unsafe_stmt.vv @@ -0,0 +1,9 @@ +fn main() { + a := 0 + unsafe { + unsafe { + a++ + } + } + println(a) +}