From 99169ae4ffbca03c680c34dd035c4214f1c95484 Mon Sep 17 00:00:00 2001 From: BigBlack <840206@qq.com> Date: Tue, 12 Nov 2019 04:39:16 +0800 Subject: [PATCH] parser: ptr++,*(ptr+1) --- vlib/compiler/expression.v | 13 +++++++++++++ vlib/compiler/parser.v | 4 ++-- vlib/compiler/tests/pointers_test.v | 3 +++ 3 files changed, 18 insertions(+), 2 deletions(-) diff --git a/vlib/compiler/expression.v b/vlib/compiler/expression.v index 091645f547..8930e7de70 100644 --- a/vlib/compiler/expression.v +++ b/vlib/compiler/expression.v @@ -146,6 +146,19 @@ fn (p mut Parser) name_expr() string { p.next() } + if p.tok == .lpar { + p.gen('*'.repeat(deref_nr)) + p.gen('(') + p.check(.lpar) + mut temp_type := p.bool_expression() + p.gen(')') + p.check(.rpar) + for _ in 0..deref_nr { + temp_type = temp_type.replace_once('*', '') + } + return temp_type + } + mut name := p.lit // Raw string (`s := r'hello \n ') if name == 'r' && p.peek() == .str { diff --git a/vlib/compiler/parser.v b/vlib/compiler/parser.v index 9c15694ea1..252de6de3c 100644 --- a/vlib/compiler/parser.v +++ b/vlib/compiler/parser.v @@ -1623,7 +1623,7 @@ fn (p mut Parser) var_expr(v Var) string { if !v.is_changed { p.mark_var_changed(v) } - if typ != 'int' { + if typ != 'int' && !typ.contains('*') { if !p.pref.translated && !is_number_type(typ) { p.error('cannot ++/-- value of type `$typ`') } @@ -1635,7 +1635,7 @@ fn (p mut Parser) var_expr(v Var) string { //return p.index_expr(typ, fn_ph) } else { - return 'void' + return typ } } typ = p.index_expr(typ, fn_ph) diff --git a/vlib/compiler/tests/pointers_test.v b/vlib/compiler/tests/pointers_test.v index 0c68096c80..8c3993b7fa 100644 --- a/vlib/compiler/tests/pointers_test.v +++ b/vlib/compiler/tests/pointers_test.v @@ -5,6 +5,9 @@ fn test_pointer_arithmetic() { mut parr := *int(arr.data) parr += 1 assert 2 == *parr + parr++ + assert 3 == *parr + assert *(parr + 1) == 4 } }