checker: disallow op= and infix on a voidptr (#7175)
parent
ed9aa873c1
commit
63557d0d02
|
@ -167,7 +167,7 @@ jobs:
|
||||||
- name: Fixed tests
|
- name: Fixed tests
|
||||||
run: VJOBS=1 ./v -silent test-fixed
|
run: VJOBS=1 ./v -silent test-fixed
|
||||||
- name: Build examples
|
- name: Build examples
|
||||||
run: ./v -silent build-examples
|
run: ./v build-examples
|
||||||
- name: Build examples with -autofree
|
- name: Build examples with -autofree
|
||||||
run: |
|
run: |
|
||||||
./v -autofree -o tetris examples/tetris/tetris.v
|
./v -autofree -o tetris examples/tetris/tetris.v
|
||||||
|
@ -231,7 +231,7 @@ jobs:
|
||||||
- name: Fixed tests (-prod)
|
- name: Fixed tests (-prod)
|
||||||
run: ./v -o vprod -prod cmd/v && ./vprod -silent test-fixed
|
run: ./v -o vprod -prod cmd/v && ./vprod -silent test-fixed
|
||||||
- name: Build examples
|
- name: Build examples
|
||||||
run: ./v -silent build-examples
|
run: ./v build-examples
|
||||||
- name: Build examples with -autofree
|
- name: Build examples with -autofree
|
||||||
run: |
|
run: |
|
||||||
./v -autofree -experimental -o tetris examples/tetris/tetris.v
|
./v -autofree -experimental -o tetris examples/tetris/tetris.v
|
||||||
|
|
|
@ -30,7 +30,7 @@ fn main() {
|
||||||
checksum = 0
|
checksum = 0
|
||||||
for len in str_lens {
|
for len in str_lens {
|
||||||
end_pos := start_pos + len
|
end_pos := start_pos + len
|
||||||
checksum ^= wyhash.wyhash_c(unsafe { bytepile.data + start_pos }, u64(len), 1)
|
checksum ^= wyhash.wyhash_c(unsafe { byteptr(bytepile.data) + start_pos }, u64(len), 1)
|
||||||
start_pos = end_pos
|
start_pos = end_pos
|
||||||
}
|
}
|
||||||
bhashing_1.measure('wyhash.wyhash_c | checksum: ${checksum:22}')
|
bhashing_1.measure('wyhash.wyhash_c | checksum: ${checksum:22}')
|
||||||
|
|
|
@ -46,7 +46,7 @@ pub fn (mut ctx Context) run() ? {
|
||||||
// TODO: remove
|
// TODO: remove
|
||||||
fn (mut ctx Context) shift(len int) {
|
fn (mut ctx Context) shift(len int) {
|
||||||
unsafe {
|
unsafe {
|
||||||
C.memmove(ctx.read_buf.data, ctx.read_buf.data + len, ctx.read_buf.cap - len)
|
C.memmove(ctx.read_buf.data, byteptr(ctx.read_buf.data) + len, ctx.read_buf.cap - len)
|
||||||
ctx.resize_arr(ctx.read_buf.len - len)
|
ctx.resize_arr(ctx.read_buf.len - len)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -221,7 +221,7 @@ fn (mut ctx Context) termios_loop() {
|
||||||
sw.restart()
|
sw.restart()
|
||||||
if ctx.cfg.event_fn != voidptr(0) {
|
if ctx.cfg.event_fn != voidptr(0) {
|
||||||
unsafe {
|
unsafe {
|
||||||
len := C.read(C.STDIN_FILENO, ctx.read_buf.data + ctx.read_buf.len, ctx.read_buf.cap - ctx.read_buf.len)
|
len := C.read(C.STDIN_FILENO, byteptr(ctx.read_buf.data) + ctx.read_buf.len, ctx.read_buf.cap - ctx.read_buf.len)
|
||||||
ctx.resize_arr(ctx.read_buf.len + len)
|
ctx.resize_arr(ctx.read_buf.len + len)
|
||||||
}
|
}
|
||||||
if ctx.read_buf.len > 0 {
|
if ctx.read_buf.len > 0 {
|
||||||
|
|
|
@ -627,9 +627,13 @@ pub fn (mut c Checker) infix_expr(mut infix_expr ast.InfixExpr) table.Type {
|
||||||
mut left := c.table.get_type_symbol(left_type)
|
mut left := c.table.get_type_symbol(left_type)
|
||||||
left_pos := infix_expr.left.position()
|
left_pos := infix_expr.left.position()
|
||||||
right_pos := infix_expr.right.position()
|
right_pos := infix_expr.right.position()
|
||||||
if (left_type.is_ptr() || left.is_pointer()) &&
|
if (left_type.is_ptr() || left.is_pointer()) && infix_expr.op in [.plus, .minus] {
|
||||||
infix_expr.op in [.plus, .minus] && !c.inside_unsafe {
|
if !c.inside_unsafe {
|
||||||
c.warn('pointer arithmetic is only allowed in `unsafe` blocks', left_pos)
|
c.warn('pointer arithmetic is only allowed in `unsafe` blocks', left_pos)
|
||||||
|
}
|
||||||
|
if left_type == table.voidptr_type {
|
||||||
|
c.error('`$infix_expr.op` cannot be used with `voidptr`', left_pos)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
mut return_type := left_type
|
mut return_type := left_type
|
||||||
if infix_expr.op != .key_is {
|
if infix_expr.op != .key_is {
|
||||||
|
@ -2228,10 +2232,10 @@ pub fn (mut c Checker) assign_stmt(mut assign_stmt ast.AssignStmt) {
|
||||||
c.error('invalid right operand: $left_sym.name $assign_stmt.op $right_sym.name',
|
c.error('invalid right operand: $left_sym.name $assign_stmt.op $right_sym.name',
|
||||||
right.position())
|
right.position())
|
||||||
}
|
}
|
||||||
} else if !left_sym.is_number() && !left_sym.is_pointer() {
|
} else if !left_sym.is_number() && left_sym.kind !in [.byteptr, .charptr] {
|
||||||
c.error('operator `$assign_stmt.op` not defined on left operand type `$left_sym.name`',
|
c.error('operator `$assign_stmt.op` not defined on left operand type `$left_sym.name`',
|
||||||
left.position())
|
left.position())
|
||||||
} else if !right_sym.is_number() && !right_sym.is_pointer() {
|
} else if !right_sym.is_number() && left_sym.kind !in [.byteptr, .charptr] {
|
||||||
c.error('invalid right operand: $left_sym.name $assign_stmt.op $right_sym.name',
|
c.error('invalid right operand: $left_sym.name $assign_stmt.op $right_sym.name',
|
||||||
right.position())
|
right.position())
|
||||||
} else if right is ast.IntegerLiteral {
|
} else if right is ast.IntegerLiteral {
|
||||||
|
|
|
@ -0,0 +1,42 @@
|
||||||
|
vlib/v/checker/tests/pointer_ops.vv:5:7: error: `+` cannot be used with `voidptr`
|
||||||
|
3 | unsafe {
|
||||||
|
4 | mut p := voidptr(0)
|
||||||
|
5 | _ = p + 1
|
||||||
|
| ^
|
||||||
|
6 | p++
|
||||||
|
7 | p += 3
|
||||||
|
vlib/v/checker/tests/pointer_ops.vv:6:4: error: invalid operation: ++ (non-numeric type `voidptr`)
|
||||||
|
4 | mut p := voidptr(0)
|
||||||
|
5 | _ = p + 1
|
||||||
|
6 | p++
|
||||||
|
| ~~
|
||||||
|
7 | p += 3
|
||||||
|
8 | _ = p - 1
|
||||||
|
vlib/v/checker/tests/pointer_ops.vv:7:3: error: operator `+=` not defined on left operand type `voidptr`
|
||||||
|
5 | _ = p + 1
|
||||||
|
6 | p++
|
||||||
|
7 | p += 3
|
||||||
|
| ^
|
||||||
|
8 | _ = p - 1
|
||||||
|
9 | p--
|
||||||
|
vlib/v/checker/tests/pointer_ops.vv:8:7: error: `-` cannot be used with `voidptr`
|
||||||
|
6 | p++
|
||||||
|
7 | p += 3
|
||||||
|
8 | _ = p - 1
|
||||||
|
| ^
|
||||||
|
9 | p--
|
||||||
|
10 | p -= 3
|
||||||
|
vlib/v/checker/tests/pointer_ops.vv:9:4: error: invalid operation: -- (non-numeric type `voidptr`)
|
||||||
|
7 | p += 3
|
||||||
|
8 | _ = p - 1
|
||||||
|
9 | p--
|
||||||
|
| ~~
|
||||||
|
10 | p -= 3
|
||||||
|
11 | }
|
||||||
|
vlib/v/checker/tests/pointer_ops.vv:10:3: error: operator `-=` not defined on left operand type `voidptr`
|
||||||
|
8 | _ = p - 1
|
||||||
|
9 | p--
|
||||||
|
10 | p -= 3
|
||||||
|
| ^
|
||||||
|
11 | }
|
||||||
|
12 | }
|
|
@ -0,0 +1,12 @@
|
||||||
|
// void* arithmetic is not allowed in MSVC, so ban it
|
||||||
|
fn test_voidptr() {
|
||||||
|
unsafe {
|
||||||
|
mut p := voidptr(0)
|
||||||
|
_ = p + 1
|
||||||
|
p++
|
||||||
|
p += 3
|
||||||
|
_ = p - 1
|
||||||
|
p--
|
||||||
|
p -= 3
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue