diff --git a/.github/workflows/v_benchmark_ci.yml b/.github/workflows/v_benchmark_ci.yml deleted file mode 100644 index d4f9b8756a..0000000000 --- a/.github/workflows/v_benchmark_ci.yml +++ /dev/null @@ -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 diff --git a/vlib/v/checker/fn.v b/vlib/v/checker/fn.v index c37f775261..e4145f3614 100644 --- a/vlib/v/checker/fn.v +++ b/vlib/v/checker/fn.v @@ -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' { diff --git a/vlib/v/checker/tests/top_level_fn_builtin_decl_err.out b/vlib/v/checker/tests/top_level_fn_builtin_decl_err.out new file mode 100644 index 0000000000..82a7bb7718 --- /dev/null +++ b/vlib/v/checker/tests/top_level_fn_builtin_decl_err.out @@ -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 | } diff --git a/vlib/v/checker/tests/top_level_fn_builtin_decl_err.vv b/vlib/v/checker/tests/top_level_fn_builtin_decl_err.vv new file mode 100644 index 0000000000..6efcb11710 --- /dev/null +++ b/vlib/v/checker/tests/top_level_fn_builtin_decl_err.vv @@ -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] + } +}