parser: ptr++,*(ptr+1)
parent
bd34524a1c
commit
99169ae4ff
|
@ -146,6 +146,19 @@ fn (p mut Parser) name_expr() string {
|
||||||
p.next()
|
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
|
mut name := p.lit
|
||||||
// Raw string (`s := r'hello \n ')
|
// Raw string (`s := r'hello \n ')
|
||||||
if name == 'r' && p.peek() == .str {
|
if name == 'r' && p.peek() == .str {
|
||||||
|
|
|
@ -1623,7 +1623,7 @@ fn (p mut Parser) var_expr(v Var) string {
|
||||||
if !v.is_changed {
|
if !v.is_changed {
|
||||||
p.mark_var_changed(v)
|
p.mark_var_changed(v)
|
||||||
}
|
}
|
||||||
if typ != 'int' {
|
if typ != 'int' && !typ.contains('*') {
|
||||||
if !p.pref.translated && !is_number_type(typ) {
|
if !p.pref.translated && !is_number_type(typ) {
|
||||||
p.error('cannot ++/-- value of 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)
|
//return p.index_expr(typ, fn_ph)
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
return 'void'
|
return typ
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
typ = p.index_expr(typ, fn_ph)
|
typ = p.index_expr(typ, fn_ph)
|
||||||
|
|
|
@ -5,6 +5,9 @@ fn test_pointer_arithmetic() {
|
||||||
mut parr := *int(arr.data)
|
mut parr := *int(arr.data)
|
||||||
parr += 1
|
parr += 1
|
||||||
assert 2 == *parr
|
assert 2 == *parr
|
||||||
|
parr++
|
||||||
|
assert 3 == *parr
|
||||||
|
assert *(parr + 1) == 4
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue