mirror of
https://github.com/vlang/v.git
synced 2023-08-10 21:13:21 +03:00
checker: disallow top level decl builtin fn (#17857)
This commit is contained in:
@@ -275,6 +275,11 @@ fn (mut c Checker) fn_decl(mut node ast.FnDecl) {
|
||||
c.error('fn `init` cannot have a return type', node.pos)
|
||||
}
|
||||
}
|
||||
|
||||
if node.language == .v && node.mod == 'main' && node.name.after_char(`.`) in reserved_type_names
|
||||
&& !node.is_method && !c.is_builtin_mod {
|
||||
c.error('top level declaration cannot shadow builtin type', node.pos)
|
||||
}
|
||||
if node.return_type != ast.Type(0) {
|
||||
c.ensure_type_exists(node.return_type, node.return_type_pos) or { return }
|
||||
if node.language == .v && node.is_method && node.name == 'str' {
|
||||
|
||||
28
vlib/v/checker/tests/top_level_fn_builtin_decl_err.out
Normal file
28
vlib/v/checker/tests/top_level_fn_builtin_decl_err.out
Normal file
@@ -0,0 +1,28 @@
|
||||
vlib/v/checker/tests/top_level_fn_builtin_decl_err.vv:3:1: error: top level declaration cannot shadow builtin type
|
||||
1 |
|
||||
2 | [inline]
|
||||
3 | fn char(ch byte) fn (string) !(byte, string) {
|
||||
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
4 | return fn [ch] (input string) !(byte, string) {
|
||||
5 | return if input[0] == ch {
|
||||
vlib/v/checker/tests/top_level_fn_builtin_decl_err.vv:19:18: error: unknown function: a_char
|
||||
17 |
|
||||
18 | for i, input in inputs {
|
||||
19 | got, remain := a_char(input)!
|
||||
| ~~~~~~~~~~~~~
|
||||
20 |
|
||||
21 | assert got == 'a'[0]
|
||||
vlib/v/checker/tests/top_level_fn_builtin_decl_err.vv:21:10: error: invalid variable `got`
|
||||
19 | got, remain := a_char(input)!
|
||||
20 |
|
||||
21 | assert got == 'a'[0]
|
||||
| ~~~
|
||||
22 | assert remain == remains[i]
|
||||
23 | }
|
||||
vlib/v/checker/tests/top_level_fn_builtin_decl_err.vv:22:10: error: invalid variable `remain`
|
||||
20 |
|
||||
21 | assert got == 'a'[0]
|
||||
22 | assert remain == remains[i]
|
||||
| ~~~~~~
|
||||
23 | }
|
||||
24 | }
|
||||
24
vlib/v/checker/tests/top_level_fn_builtin_decl_err.vv
Normal file
24
vlib/v/checker/tests/top_level_fn_builtin_decl_err.vv
Normal file
@@ -0,0 +1,24 @@
|
||||
|
||||
[inline]
|
||||
fn char(ch byte) fn (string) !(byte, string) {
|
||||
return fn [ch] (input string) !(byte, string) {
|
||||
return if input[0] == ch {
|
||||
ch, input[1..]
|
||||
} else {
|
||||
error('Some error')
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn main() {
|
||||
a_char := int('a'[0])
|
||||
inputs := ['a', 'abc']
|
||||
remains := ['', 'bc']
|
||||
|
||||
for i, input in inputs {
|
||||
got, remain := a_char(input)!
|
||||
|
||||
assert got == 'a'[0]
|
||||
assert remain == remains[i]
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user