mirror of
https://github.com/vlang/v.git
synced 2023-08-10 21:13:21 +03:00
checker: check errors of cast to byte (#12961)
This commit is contained in:
parent
d0ad79cd8b
commit
8764a3a973
@ -3487,10 +3487,6 @@ pub fn (mut c Checker) cast_expr(mut node ast.CastExpr) ast.Type {
|
|||||||
c.error('cannot convert type `$from_type_sym.name` to `$to_type_sym.name` (alias to `$to_type_sym_final.name`)',
|
c.error('cannot convert type `$from_type_sym.name` to `$to_type_sym.name` (alias to `$to_type_sym_final.name`)',
|
||||||
node.pos)
|
node.pos)
|
||||||
}
|
}
|
||||||
} else if to_type_sym.kind == .byte && from_type_sym.kind == .alias
|
|
||||||
&& from_type_sym_final.kind != .byte && !from_type.is_ptr() {
|
|
||||||
type_name := c.table.type_to_str(from_type)
|
|
||||||
c.error('cannot cast type `$type_name` to `byte`', node.pos)
|
|
||||||
} else if to_type_sym.kind == .struct_ && !to_type.is_ptr()
|
} else if to_type_sym.kind == .struct_ && !to_type.is_ptr()
|
||||||
&& !(to_type_sym.info as ast.Struct).is_typedef {
|
&& !(to_type_sym.info as ast.Struct).is_typedef {
|
||||||
// For now we ignore C typedef because of `C.Window(C.None)` in vlib/clipboard
|
// For now we ignore C typedef because of `C.Window(C.None)` in vlib/clipboard
|
||||||
@ -3523,10 +3519,13 @@ pub fn (mut c Checker) cast_expr(mut node ast.CastExpr) ast.Type {
|
|||||||
if (to_type.is_ptr() || to_type_sym.kind !in [.sum_type, .interface_]) && !c.is_builtin_mod {
|
if (to_type.is_ptr() || to_type_sym.kind !in [.sum_type, .interface_]) && !c.is_builtin_mod {
|
||||||
from_type_name := c.table.type_to_str(from_type)
|
from_type_name := c.table.type_to_str(from_type)
|
||||||
type_name := c.table.type_to_str(to_type)
|
type_name := c.table.type_to_str(to_type)
|
||||||
snexpr := node.expr.str()
|
c.error('cannot cast struct `$from_type_name` to `$type_name`', node.pos)
|
||||||
c.error('cannot cast struct `$from_type_name` to `$type_name`, use `${snexpr}.str()` instead.',
|
|
||||||
node.pos)
|
|
||||||
}
|
}
|
||||||
|
} else if to_type_sym.kind == .byte && !from_type_sym_final.is_number()
|
||||||
|
&& !from_type_sym_final.is_pointer() && !from_type.is_ptr()
|
||||||
|
&& from_type_sym_final.kind !in [.char, .enum_, .bool] {
|
||||||
|
type_name := c.table.type_to_str(from_type)
|
||||||
|
c.error('cannot cast type `$type_name` to `byte`', node.pos)
|
||||||
} else if from_type.has_flag(.optional) || from_type.has_flag(.variadic) {
|
} else if from_type.has_flag(.optional) || from_type.has_flag(.variadic) {
|
||||||
// variadic case can happen when arrays are converted into variadic
|
// variadic case can happen when arrays are converted into variadic
|
||||||
msg := if from_type.has_flag(.optional) { 'an optional' } else { 'a variadic' }
|
msg := if from_type.has_flag(.optional) { 'an optional' } else { 'a variadic' }
|
||||||
|
@ -1,7 +0,0 @@
|
|||||||
vlib/v/checker/tests/cast_alias_to_byte_err.vv:5:7: error: cannot cast type `Foo` to `byte`
|
|
||||||
3 | fn main() {
|
|
||||||
4 | a := Foo('hello')
|
|
||||||
5 | b := byte(a)
|
|
||||||
| ~~~~~~~
|
|
||||||
6 | println(b)
|
|
||||||
7 | }
|
|
@ -1,7 +0,0 @@
|
|||||||
type Foo = string
|
|
||||||
|
|
||||||
fn main() {
|
|
||||||
a := Foo('hello')
|
|
||||||
b := byte(a)
|
|
||||||
println(b)
|
|
||||||
}
|
|
@ -12,7 +12,7 @@ vlib/v/checker/tests/cast_string_err.vv:18:9: error: cannot cast sumtype `Sumtyp
|
|||||||
| ~~~~~~~~~~
|
| ~~~~~~~~~~
|
||||||
19 | println(sst)
|
19 | println(sst)
|
||||||
20 | //
|
20 | //
|
||||||
vlib/v/checker/tests/cast_string_err.vv:22:10: error: cannot cast struct `Abc` to `string`, use `abc.str()` instead.
|
vlib/v/checker/tests/cast_string_err.vv:22:10: error: cannot cast struct `Abc` to `string`
|
||||||
20 | //
|
20 | //
|
||||||
21 | abc := Abc{}
|
21 | abc := Abc{}
|
||||||
22 | sabc := string(abc)
|
22 | sabc := string(abc)
|
||||||
|
14
vlib/v/checker/tests/cast_to_byte_err.out
Normal file
14
vlib/v/checker/tests/cast_to_byte_err.out
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
vlib/v/checker/tests/cast_to_byte_err.vv:10:7: error: cannot cast type `string` to `byte`
|
||||||
|
8 | fn main() {
|
||||||
|
9 | // should be errors:
|
||||||
|
10 | _ := byte('hello')
|
||||||
|
| ~~~~~~~~~~~~~
|
||||||
|
11 | _ := byte(SAlias('hello'))
|
||||||
|
12 |
|
||||||
|
vlib/v/checker/tests/cast_to_byte_err.vv:11:7: error: cannot cast type `SAlias` to `byte`
|
||||||
|
9 | // should be errors:
|
||||||
|
10 | _ := byte('hello')
|
||||||
|
11 | _ := byte(SAlias('hello'))
|
||||||
|
| ~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
12 |
|
||||||
|
13 | // should be allowed:
|
23
vlib/v/checker/tests/cast_to_byte_err.vv
Normal file
23
vlib/v/checker/tests/cast_to_byte_err.vv
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
type SAlias = string
|
||||||
|
|
||||||
|
type CAlias = char
|
||||||
|
type IAlias = int
|
||||||
|
type UAlias = u32
|
||||||
|
type FAlias = f32
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
// should be errors:
|
||||||
|
_ := byte('hello')
|
||||||
|
_ := byte(SAlias('hello'))
|
||||||
|
|
||||||
|
// should be allowed:
|
||||||
|
_ := byte(char(1))
|
||||||
|
_ := byte(int(1))
|
||||||
|
_ := byte(u32(1))
|
||||||
|
_ := byte(f32(1.0))
|
||||||
|
|
||||||
|
_ := byte(CAlias(1))
|
||||||
|
_ := byte(IAlias(1))
|
||||||
|
_ := byte(UAlias(1))
|
||||||
|
_ := byte(FAlias(1))
|
||||||
|
}
|
@ -1,60 +1,60 @@
|
|||||||
vlib/v/checker/tests/struct_type_cast_err.vv:5:10: error: cannot cast struct `Foo` to `string`, use `foo.str()` instead.
|
vlib/v/checker/tests/struct_type_cast_err.vv:5:10: error: cannot cast struct `Foo` to `string`
|
||||||
3 | fn main() {
|
3 | fn main() {
|
||||||
4 | foo := Foo{}
|
4 | foo := Foo{}
|
||||||
5 | _ := string(foo)
|
5 | _ := string(foo)
|
||||||
| ~~~~~~~~~~~
|
| ~~~~~~~~~~~
|
||||||
6 | _ := int(foo)
|
6 | _ := int(foo)
|
||||||
7 | _ := u64(foo)
|
7 | _ := u64(foo)
|
||||||
vlib/v/checker/tests/struct_type_cast_err.vv:6:10: error: cannot cast struct `Foo` to `int`, use `foo.str()` instead.
|
vlib/v/checker/tests/struct_type_cast_err.vv:6:10: error: cannot cast struct `Foo` to `int`
|
||||||
4 | foo := Foo{}
|
4 | foo := Foo{}
|
||||||
5 | _ := string(foo)
|
5 | _ := string(foo)
|
||||||
6 | _ := int(foo)
|
6 | _ := int(foo)
|
||||||
| ~~~~~~~~
|
| ~~~~~~~~
|
||||||
7 | _ := u64(foo)
|
7 | _ := u64(foo)
|
||||||
8 | _ := u32(foo)
|
8 | _ := u32(foo)
|
||||||
vlib/v/checker/tests/struct_type_cast_err.vv:7:10: error: cannot cast struct `Foo` to `u64`, use `foo.str()` instead.
|
vlib/v/checker/tests/struct_type_cast_err.vv:7:10: error: cannot cast struct `Foo` to `u64`
|
||||||
5 | _ := string(foo)
|
5 | _ := string(foo)
|
||||||
6 | _ := int(foo)
|
6 | _ := int(foo)
|
||||||
7 | _ := u64(foo)
|
7 | _ := u64(foo)
|
||||||
| ~~~~~~~~
|
| ~~~~~~~~
|
||||||
8 | _ := u32(foo)
|
8 | _ := u32(foo)
|
||||||
9 | _ := rune(foo)
|
9 | _ := rune(foo)
|
||||||
vlib/v/checker/tests/struct_type_cast_err.vv:8:10: error: cannot cast struct `Foo` to `u32`, use `foo.str()` instead.
|
vlib/v/checker/tests/struct_type_cast_err.vv:8:10: error: cannot cast struct `Foo` to `u32`
|
||||||
6 | _ := int(foo)
|
6 | _ := int(foo)
|
||||||
7 | _ := u64(foo)
|
7 | _ := u64(foo)
|
||||||
8 | _ := u32(foo)
|
8 | _ := u32(foo)
|
||||||
| ~~~~~~~~
|
| ~~~~~~~~
|
||||||
9 | _ := rune(foo)
|
9 | _ := rune(foo)
|
||||||
10 | _ := byte(foo)
|
10 | _ := byte(foo)
|
||||||
vlib/v/checker/tests/struct_type_cast_err.vv:9:10: error: cannot cast struct `Foo` to `rune`, use `foo.str()` instead.
|
vlib/v/checker/tests/struct_type_cast_err.vv:9:10: error: cannot cast struct `Foo` to `rune`
|
||||||
7 | _ := u64(foo)
|
7 | _ := u64(foo)
|
||||||
8 | _ := u32(foo)
|
8 | _ := u32(foo)
|
||||||
9 | _ := rune(foo)
|
9 | _ := rune(foo)
|
||||||
| ~~~~~~~~~
|
| ~~~~~~~~~
|
||||||
10 | _ := byte(foo)
|
10 | _ := byte(foo)
|
||||||
11 | _ := i8(foo)
|
11 | _ := i8(foo)
|
||||||
vlib/v/checker/tests/struct_type_cast_err.vv:10:10: error: cannot cast struct `Foo` to `byte`, use `foo.str()` instead.
|
vlib/v/checker/tests/struct_type_cast_err.vv:10:10: error: cannot cast struct `Foo` to `byte`
|
||||||
8 | _ := u32(foo)
|
8 | _ := u32(foo)
|
||||||
9 | _ := rune(foo)
|
9 | _ := rune(foo)
|
||||||
10 | _ := byte(foo)
|
10 | _ := byte(foo)
|
||||||
| ~~~~~~~~~
|
| ~~~~~~~~~
|
||||||
11 | _ := i8(foo)
|
11 | _ := i8(foo)
|
||||||
12 | _ := i64(foo)
|
12 | _ := i64(foo)
|
||||||
vlib/v/checker/tests/struct_type_cast_err.vv:11:10: error: cannot cast struct `Foo` to `i8`, use `foo.str()` instead.
|
vlib/v/checker/tests/struct_type_cast_err.vv:11:10: error: cannot cast struct `Foo` to `i8`
|
||||||
9 | _ := rune(foo)
|
9 | _ := rune(foo)
|
||||||
10 | _ := byte(foo)
|
10 | _ := byte(foo)
|
||||||
11 | _ := i8(foo)
|
11 | _ := i8(foo)
|
||||||
| ~~~~~~~
|
| ~~~~~~~
|
||||||
12 | _ := i64(foo)
|
12 | _ := i64(foo)
|
||||||
13 | _ := int(foo)
|
13 | _ := int(foo)
|
||||||
vlib/v/checker/tests/struct_type_cast_err.vv:12:10: error: cannot cast struct `Foo` to `i64`, use `foo.str()` instead.
|
vlib/v/checker/tests/struct_type_cast_err.vv:12:10: error: cannot cast struct `Foo` to `i64`
|
||||||
10 | _ := byte(foo)
|
10 | _ := byte(foo)
|
||||||
11 | _ := i8(foo)
|
11 | _ := i8(foo)
|
||||||
12 | _ := i64(foo)
|
12 | _ := i64(foo)
|
||||||
| ~~~~~~~~
|
| ~~~~~~~~
|
||||||
13 | _ := int(foo)
|
13 | _ := int(foo)
|
||||||
14 | _ = &I1(foo)
|
14 | _ = &I1(foo)
|
||||||
vlib/v/checker/tests/struct_type_cast_err.vv:13:10: error: cannot cast struct `Foo` to `int`, use `foo.str()` instead.
|
vlib/v/checker/tests/struct_type_cast_err.vv:13:10: error: cannot cast struct `Foo` to `int`
|
||||||
11 | _ := i8(foo)
|
11 | _ := i8(foo)
|
||||||
12 | _ := i64(foo)
|
12 | _ := i64(foo)
|
||||||
13 | _ := int(foo)
|
13 | _ := int(foo)
|
||||||
|
Loading…
Reference in New Issue
Block a user