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:
parent
22afdb5cbf
commit
1dcec62c19
36
.github/workflows/v_benchmark_ci.yml
vendored
36
.github/workflows/v_benchmark_ci.yml
vendored
@ -1,36 +0,0 @@
|
||||
name: vlang benchmarks
|
||||
|
||||
on:
|
||||
push:
|
||||
paths-ignore:
|
||||
- "**.md"
|
||||
pull_request:
|
||||
paths-ignore:
|
||||
- "**.md"
|
||||
|
||||
jobs:
|
||||
run:
|
||||
name: Run
|
||||
runs-on: ubuntu-latest
|
||||
if: github.event_name != 'push' || github.event.ref == 'refs/heads/master' || github.event.repository.full_name != 'vlang/v'
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v3
|
||||
- name: Install google benchmark
|
||||
run: |
|
||||
git clone https://github.com/google/benchmark.git
|
||||
cd benchmark
|
||||
cmake -E make_directory "build"
|
||||
cmake -E chdir "build" cmake -DBENCHMARK_DOWNLOAD_DEPENDENCIES=on -DCMAKE_BUILD_TYPE=Release ../
|
||||
sudo cmake --build "build" --config Release --target install
|
||||
- name: Run V benchmark
|
||||
run: |
|
||||
make
|
||||
sudo ./v symlink
|
||||
git clone https://github.com/vincenzopalazzo/benchmarks.git
|
||||
cd benchmarks
|
||||
make vdep && make v
|
||||
- uses: actions/upload-artifact@v3
|
||||
with:
|
||||
name: vlang-benchmark
|
||||
path: benchmarks/vlang/*.json
|
@ -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]
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user