1
0
mirror of https://github.com/vlang/v.git synced 2023-08-10 21:13:21 +03:00

checker: make sure negation is only used with numeric types (#9854)

This commit is contained in:
Enzo 2021-04-23 14:18:56 +02:00 committed by GitHub
parent dd2002cc57
commit b4e4d48bbd
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 87 additions and 58 deletions

View File

@ -328,12 +328,6 @@ pub fn (typ Type) is_number() bool {
return typ.clear_flags() in ast.number_type_idxs
}
pub fn (typ Type) is_number_or_literal() bool {
res := int(typ) in ast.number_type_idxs
eprintln('> is_number_or_literal typ: $typ.debug() | res: $res')
return res
}
[inline]
pub fn (typ Type) is_string() bool {
return typ.idx() in ast.string_type_idxs

View File

@ -5883,14 +5883,19 @@ pub fn (mut c Checker) prefix_expr(mut node ast.PrefixExpr) ast.Type {
if node.op == .not && right_type != ast.bool_type_idx && !c.pref.translated {
c.error('! operator can only be used with bool types', node.pos)
}
// FIXME
// there are currently other issues to investigate if right_type
// is unwraped directly as initialization, so do it here
right_sym := c.table.get_final_type_symbol(c.unwrap_generic(right_type))
if node.op == .minus && !right_sym.is_number() {
c.error('- operator can only be used with numeric types', node.pos)
}
if node.op == .arrow {
right := c.table.get_type_symbol(right_type)
if right.kind == .chan {
if right_sym.kind == .chan {
c.stmts(node.or_block.stmts)
return right.chan_info().elem_type
} else {
c.error('<- operator can only be used with `chan` types', node.pos)
return right_sym.chan_info().elem_type
}
c.error('<- operator can only be used with `chan` types', node.pos)
}
return right_type
}

View File

@ -1,42 +1,62 @@
vlib/v/checker/tests/minus_op_wrong_type_err.vv:3:13: error: mismatched types `Aaa` and `int literal`
1 | struct Aaa{}
2 | fn main() {
3 | println(Aaa{} - 10)
vlib/v/checker/tests/minus_op_wrong_type_err.vv:10:10: error: mismatched types `Aaa` and `int literal`
8 |
9 | fn main() {
10 | println(Aaa{} - 10)
| ~~~~~~~~~~
4 | println(10 - Aaa{})
5 | println([1,2,3] - 10)
vlib/v/checker/tests/minus_op_wrong_type_err.vv:4:13: error: mismatched types `int literal` and `Aaa`
2 | fn main() {
3 | println(Aaa{} - 10)
4 | println(10 - Aaa{})
11 | println(10 - Aaa{})
12 | println([1, 2, 3] - 10)
vlib/v/checker/tests/minus_op_wrong_type_err.vv:11:10: error: mismatched types `int literal` and `Aaa`
9 | fn main() {
10 | println(Aaa{} - 10)
11 | println(10 - Aaa{})
| ~~~~~~~~~~
5 | println([1,2,3] - 10)
6 | println(10 - [1,2,3])
vlib/v/checker/tests/minus_op_wrong_type_err.vv:5:13: error: mismatched types `[]int` and `int literal`
3 | println(Aaa{} - 10)
4 | println(10 - Aaa{})
5 | println([1,2,3] - 10)
| ~~~~~~~~~~~~
6 | println(10 - [1,2,3])
7 | a := map[string]int
vlib/v/checker/tests/minus_op_wrong_type_err.vv:6:13: error: mismatched types `int literal` and `[]int`
4 | println(10 - Aaa{})
5 | println([1,2,3] - 10)
6 | println(10 - [1,2,3])
| ~~~~~~~~~~~~
7 | a := map[string]int
8 | println(a - 10)
vlib/v/checker/tests/minus_op_wrong_type_err.vv:8:13: error: mismatched types `map[string]int` and `int literal`
6 | println(10 - [1,2,3])
7 | a := map[string]int
8 | println(a - 10)
12 | println([1, 2, 3] - 10)
13 | println(10 - [1, 2, 3])
vlib/v/checker/tests/minus_op_wrong_type_err.vv:12:10: error: mismatched types `[]int` and `int literal`
10 | println(Aaa{} - 10)
11 | println(10 - Aaa{})
12 | println([1, 2, 3] - 10)
| ~~~~~~~~~~~~~~
13 | println(10 - [1, 2, 3])
14 | a := map[string]int{}
vlib/v/checker/tests/minus_op_wrong_type_err.vv:13:10: error: mismatched types `int literal` and `[]int`
11 | println(10 - Aaa{})
12 | println([1, 2, 3] - 10)
13 | println(10 - [1, 2, 3])
| ~~~~~~~~~~~~~~
14 | a := map[string]int{}
15 | println(a - 10)
vlib/v/checker/tests/minus_op_wrong_type_err.vv:15:10: error: mismatched types `map[string]int` and `int literal`
13 | println(10 - [1, 2, 3])
14 | a := map[string]int{}
15 | println(a - 10)
| ~~~~~~
9 | println(10 - a)
10 | }
vlib/v/checker/tests/minus_op_wrong_type_err.vv:9:13: error: mismatched types `int literal` and `map[string]int`
7 | a := map[string]int
8 | println(a - 10)
9 | println(10 - a)
16 | println(10 - a)
17 | println(-Aaa{})
vlib/v/checker/tests/minus_op_wrong_type_err.vv:16:10: error: mismatched types `int literal` and `map[string]int`
14 | a := map[string]int{}
15 | println(a - 10)
16 | println(10 - a)
| ~~~~~~
10 | }
17 | println(-Aaa{})
18 | println(-a)
vlib/v/checker/tests/minus_op_wrong_type_err.vv:17:10: error: - operator can only be used with numeric types
15 | println(a - 10)
16 | println(10 - a)
17 | println(-Aaa{})
| ^
18 | println(-a)
19 | println(-Color.red)
vlib/v/checker/tests/minus_op_wrong_type_err.vv:18:10: error: - operator can only be used with numeric types
16 | println(10 - a)
17 | println(-Aaa{})
18 | println(-a)
| ^
19 | println(-Color.red)
20 | }
vlib/v/checker/tests/minus_op_wrong_type_err.vv:19:10: error: - operator can only be used with numeric types
17 | println(-Aaa{})
18 | println(-a)
19 | println(-Color.red)
| ^
20 | }

View File

@ -1,10 +1,20 @@
struct Aaa{}
fn main() {
println(Aaa{} - 10)
println(10 - Aaa{})
println([1,2,3] - 10)
println(10 - [1,2,3])
a := map[string]int
println(a - 10)
println(10 - a)
struct Aaa {}
enum Color {
red
green
blue
}
fn main() {
println(Aaa{} - 10)
println(10 - Aaa{})
println([1, 2, 3] - 10)
println(10 - [1, 2, 3])
a := map[string]int{}
println(a - 10)
println(10 - a)
println(-Aaa{})
println(-a)
println(-Color.red)
}