checker: do now allow type name shadowing (#11401)
parent
51410b0922
commit
3fd2dd45a4
|
@ -31,6 +31,8 @@ const (
|
||||||
valid_comp_not_user_defined = all_valid_comptime_idents()
|
valid_comp_not_user_defined = all_valid_comptime_idents()
|
||||||
array_builtin_methods = ['filter', 'clone', 'repeat', 'reverse', 'map', 'slice', 'sort',
|
array_builtin_methods = ['filter', 'clone', 'repeat', 'reverse', 'map', 'slice', 'sort',
|
||||||
'contains', 'index', 'wait', 'any', 'all', 'first', 'last', 'pop']
|
'contains', 'index', 'wait', 'any', 'all', 'first', 'last', 'pop']
|
||||||
|
reserved_type_names = ['bool', 'i8', 'i16', 'int', 'i64', 'byte', 'u16', 'u32', 'u64',
|
||||||
|
'f32', 'f64', 'string', 'tune']
|
||||||
vroot_is_deprecated_message = '@VROOT is deprecated, use @VMODROOT or @VEXEROOT instead'
|
vroot_is_deprecated_message = '@VROOT is deprecated, use @VMODROOT or @VEXEROOT instead'
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -4026,6 +4028,10 @@ pub fn (mut c Checker) assign_stmt(mut node ast.AssignStmt) {
|
||||||
} else {
|
} else {
|
||||||
if is_decl {
|
if is_decl {
|
||||||
c.check_valid_snake_case(left.name, 'variable name', left.pos)
|
c.check_valid_snake_case(left.name, 'variable name', left.pos)
|
||||||
|
if left.name in checker.reserved_type_names {
|
||||||
|
c.error('invalid use of reserved type `$left.name` as a variable name',
|
||||||
|
left.pos)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
mut ident_var_info := left.info as ast.IdentVar
|
mut ident_var_info := left.info as ast.IdentVar
|
||||||
if ident_var_info.share == .shared_t {
|
if ident_var_info.share == .shared_t {
|
||||||
|
|
|
@ -0,0 +1,34 @@
|
||||||
|
vlib/v/checker/tests/invalid_variable_name_err.vv:2:2: error: invalid use of reserved type `string` as a variable name
|
||||||
|
1 | fn main() {
|
||||||
|
2 | string := 'hello, world'
|
||||||
|
| ~~~~~~
|
||||||
|
3 | println(string)
|
||||||
|
4 |
|
||||||
|
vlib/v/checker/tests/invalid_variable_name_err.vv:5:2: error: invalid use of reserved type `bool` as a variable name
|
||||||
|
3 | println(string)
|
||||||
|
4 |
|
||||||
|
5 | bool := true
|
||||||
|
| ~~~~
|
||||||
|
6 | println(bool)
|
||||||
|
7 |
|
||||||
|
vlib/v/checker/tests/invalid_variable_name_err.vv:8:2: error: invalid use of reserved type `int` as a variable name
|
||||||
|
6 | println(bool)
|
||||||
|
7 |
|
||||||
|
8 | int := 22
|
||||||
|
| ~~~
|
||||||
|
9 | println(int)
|
||||||
|
10 |
|
||||||
|
vlib/v/checker/tests/invalid_variable_name_err.vv:11:2: error: invalid use of reserved type `u64` as a variable name
|
||||||
|
9 | println(int)
|
||||||
|
10 |
|
||||||
|
11 | u64 := 222
|
||||||
|
| ~~~
|
||||||
|
12 | println(u64)
|
||||||
|
13 |
|
||||||
|
vlib/v/checker/tests/invalid_variable_name_err.vv:14:2: error: invalid use of reserved type `f64` as a variable name
|
||||||
|
12 | println(u64)
|
||||||
|
13 |
|
||||||
|
14 | f64 := 2.22
|
||||||
|
| ~~~
|
||||||
|
15 | println(f64)
|
||||||
|
16 | }
|
|
@ -0,0 +1,16 @@
|
||||||
|
fn main() {
|
||||||
|
string := 'hello, world'
|
||||||
|
println(string)
|
||||||
|
|
||||||
|
bool := true
|
||||||
|
println(bool)
|
||||||
|
|
||||||
|
int := 22
|
||||||
|
println(int)
|
||||||
|
|
||||||
|
u64 := 222
|
||||||
|
println(u64)
|
||||||
|
|
||||||
|
f64 := 2.22
|
||||||
|
println(f64)
|
||||||
|
}
|
|
@ -6,8 +6,4 @@ fn test_reserved_keywords_array_and_string() {
|
||||||
assert res1 == [3, 6, 9, 12]
|
assert res1 == [3, 6, 9, 12]
|
||||||
println(res2)
|
println(res2)
|
||||||
assert res2 == [3, 4]
|
assert res2 == [3, 4]
|
||||||
|
|
||||||
string := 'hello'
|
|
||||||
println(string)
|
|
||||||
assert string == 'hello'
|
|
||||||
}
|
}
|
Loading…
Reference in New Issue