ci: update linux image runners from ubuntu-20.04 to ubuntu-24.04 (#23706)

This commit is contained in:
Delyan Angelov 2025-02-17 07:37:59 +02:00 committed by GitHub
parent 7b97709449
commit 55f482bb63
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
46 changed files with 445 additions and 195 deletions

View file

@ -24,7 +24,7 @@ on:
- '!**/bootstrapping_ci.yml' - '!**/bootstrapping_ci.yml'
concurrency: concurrency:
group: ${{ github.workflow }}-${{ github.ref == 'refs/heads/master' && github.sha || github.ref }} group: bootstrapping-${{ github.workflow }}-${{ github.ref == 'refs/heads/master' && github.sha || github.ref }}
cancel-in-progress: true cancel-in-progress: true
jobs: jobs:

View file

@ -23,7 +23,7 @@ on:
- '!cmd/tools/builders/**.v' - '!cmd/tools/builders/**.v'
concurrency: concurrency:
group: ${{ github.workflow }}-${{ github.ref == 'refs/heads/master' && github.sha || github.ref }} group: c2v-${{ github.workflow }}-${{ github.ref == 'refs/heads/master' && github.sha || github.ref }}
cancel-in-progress: true cancel-in-progress: true
jobs: jobs:
@ -71,7 +71,7 @@ jobs:
WAD_FILE=~/DOOM1.WAD ~/code/doom/build_whole_project.sh WAD_FILE=~/DOOM1.WAD ~/code/doom/build_whole_project.sh
test-regression: test-regression:
runs-on: ubuntu-20.04 runs-on: ubuntu-24.04
timeout-minutes: 20 timeout-minutes: 20
env: env:
VFLAGS: -cc tcc VFLAGS: -cc tcc

View file

@ -17,7 +17,7 @@ on:
- '!cmd/tools/builders/**.v' - '!cmd/tools/builders/**.v'
concurrency: concurrency:
group: ${{ github.workflow }}-${{ github.ref == 'refs/heads/master' && github.sha || github.ref }} group: cross-${{ github.workflow }}-${{ github.ref == 'refs/heads/master' && github.sha || github.ref }}
cancel-in-progress: true cancel-in-progress: true
jobs: jobs:
@ -52,7 +52,7 @@ jobs:
./v -os windows examples/2048/2048.v ./v -os windows examples/2048/2048.v
linux-cross: linux-cross:
runs-on: ubuntu-20.04 runs-on: ubuntu-24.04
timeout-minutes: 25 timeout-minutes: 25
env: env:
VFLAGS: -cc tcc -no-retry-compilation VFLAGS: -cc tcc -no-retry-compilation
@ -65,14 +65,12 @@ jobs:
- name: Install dependencies - name: Install dependencies
run: | run: |
## sudo dpkg --add-architecture i386 ./v retry -- sudo apt install --quiet -y mingw-w64 wine wine64 winetricks libssl-dev sqlite3 libsqlite3-dev
./v retry -- sudo apt update
./v retry -- sudo apt install --quiet -y libssl-dev sqlite3 libsqlite3-dev
./v retry -- sudo apt install --quiet -y mingw-w64 wine-stable winetricks
## ./v retry -- sudo apt install --quiet -y wine32
- name: Turn off the wine crash dialog - name: Show diagnostics for wine
run: winetricks nocrashdialog run: |
which wine
ls -la $(realpath $(which wine))
- name: v.c can be compiled and run with -os cross - name: v.c can be compiled and run with -os cross
run: | run: |
@ -86,13 +84,13 @@ jobs:
./v -cc msvc -os windows -o /tmp/v_win.c cmd/v ./v -cc msvc -os windows -o /tmp/v_win.c cmd/v
x86_64-w64-mingw32-gcc /tmp/v_win.c -std=c99 -w -municode -o v_from_vc.exe -lws2_32 x86_64-w64-mingw32-gcc /tmp/v_win.c -std=c99 -w -municode -o v_from_vc.exe -lws2_32
ls -lart v_from_vc.exe ls -lart v_from_vc.exe
wine64 ./v_from_vc.exe version wine ./v_from_vc.exe version
- name: hello_world.v can be cross compiled to hello_world.exe - name: hello_world.v can be cross compiled to hello_world.exe
run: | run: |
./v -os windows examples/hello_world.v ./v -os windows examples/hello_world.v
ls -lart examples/hello_world.exe ls -lart examples/hello_world.exe
wine64 examples/hello_world.exe wine examples/hello_world.exe
- name: 2048.v can be cross compiled to 2048.exe - name: 2048.v can be cross compiled to 2048.exe
run: | run: |

View file

@ -17,7 +17,7 @@ on:
- '!cmd/tools/builders/**.v' - '!cmd/tools/builders/**.v'
concurrency: concurrency:
group: ${{ github.workflow }}-${{ github.ref == 'refs/heads/master' && github.sha || github.ref }} group: docker-${{ github.workflow }}-${{ github.ref == 'refs/heads/master' && github.sha || github.ref }}
cancel-in-progress: true cancel-in-progress: true
env: env:
@ -25,7 +25,7 @@ env:
jobs: jobs:
docker-alpine-musl-gcc: docker-alpine-musl-gcc:
runs-on: ubuntu-20.04 runs-on: ubuntu-24.04
timeout-minutes: 241 timeout-minutes: 241
container: container:
image: thevlang/vlang:alpine-build image: thevlang/vlang:alpine-build
@ -54,7 +54,7 @@ jobs:
run: VTEST_JUST_ESSENTIAL=1 ./v test-self run: VTEST_JUST_ESSENTIAL=1 ./v test-self
docker-ubuntu-musl: docker-ubuntu-musl:
runs-on: ubuntu-20.04 runs-on: ubuntu-24.04
timeout-minutes: 121 timeout-minutes: 121
container: container:
image: thevlang/vlang:ubuntu-build image: thevlang/vlang:ubuntu-build

View file

@ -17,24 +17,26 @@ on:
- 'cmd/tools/vrepl.v' - 'cmd/tools/vrepl.v'
concurrency: concurrency:
group: ${{ github.workflow }}-${{ github.ref == 'refs/heads/master' && github.sha || github.ref }} group: docs-${{ github.workflow }}-${{ github.ref == 'refs/heads/master' && github.sha || github.ref }}
cancel-in-progress: true cancel-in-progress: true
jobs: jobs:
check-markdown: check-markdown:
runs-on: ubuntu-20.04 runs-on: ubuntu-24.04
timeout-minutes: 5 timeout-minutes: 10
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
- name: Build V - name: Build V
run: make run: make
- name: Install dependencies (some examples show how to use sqlite and the x11 clipboard)
run: ./v retry -- sudo apt install --quiet -y libx11-dev libssl-dev sqlite3 libsqlite3-dev
- name: Check markdown line length & code examples - name: Check markdown line length & code examples
run: ./v check-md -hide-warnings . run: ./v check-md -hide-warnings .
## NB: -hide-warnings is used here, so that the output is less noisy, ## NB: -hide-warnings is used here, so that the output is less noisy,
## thus real errors are easier to spot. ## thus real errors are easier to spot.
report-missing-fn-doc: report-missing-fn-doc:
runs-on: ubuntu-20.04 runs-on: ubuntu-24.04
timeout-minutes: 5 timeout-minutes: 5
env: env:
MOPTIONS: --diff --deprecated --relative-paths --exclude /vlib/v/ --exclude /builtin/linux_bare/ --exclude /testdata/ --exclude /tests/ MOPTIONS: --diff --deprecated --relative-paths --exclude /vlib/v/ --exclude /builtin/linux_bare/ --exclude /testdata/ --exclude /tests/

View file

@ -24,7 +24,7 @@ on:
# Allow only one concurrent deployment, skipping runs queued between the run in-progress and latest queued. # Allow only one concurrent deployment, skipping runs queued between the run in-progress and latest queued.
# However, do NOT cancel in-progress runs as we want to allow these production deployments to complete. # However, do NOT cancel in-progress runs as we want to allow these production deployments to complete.
concurrency: concurrency:
group: ${{ github.workflow }}-${{ github.ref }} group: gen_vc-${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: ${{ !contains(github.ref, 'master')}} cancel-in-progress: ${{ !contains(github.ref, 'master')}}
jobs: jobs:

View file

@ -17,12 +17,12 @@ on:
- '!**.md' - '!**.md'
concurrency: concurrency:
group: ${{ github.workflow }}-${{ github.ref == 'refs/heads/master' && github.sha || github.ref }} group: gg-regressions-${{ github.workflow }}-${{ github.ref == 'refs/heads/master' && github.sha || github.ref }}
cancel-in-progress: true cancel-in-progress: true
jobs: jobs:
gg-regressions: gg-regressions:
runs-on: ubuntu-20.04 runs-on: ubuntu-24.04
timeout-minutes: 20 timeout-minutes: 20
env: env:
VFLAGS: -cc tcc VFLAGS: -cc tcc

View file

@ -18,12 +18,12 @@ on:
- '!cmd/tools/builders/**.v' - '!cmd/tools/builders/**.v'
concurrency: concurrency:
group: ${{ github.workflow }}-${{ github.ref == 'refs/heads/master' && github.sha || github.ref }} group: linux-${{ github.workflow }}-${{ github.ref == 'refs/heads/master' && github.sha || github.ref }}
cancel-in-progress: true cancel-in-progress: true
jobs: jobs:
tcc: tcc:
runs-on: ubuntu-20.04 runs-on: ubuntu-24.04
timeout-minutes: 121 timeout-minutes: 121
env: env:
VFLAGS: -cc tcc -no-retry-compilation VFLAGS: -cc tcc -no-retry-compilation
@ -81,7 +81,7 @@ jobs:
run: v run ci/linux_ci.vsh test_leak_detector_not_active_tcc run: v run ci/linux_ci.vsh test_leak_detector_not_active_tcc
gcc: gcc:
runs-on: ubuntu-20.04 runs-on: ubuntu-24.04
timeout-minutes: 121 timeout-minutes: 121
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
@ -135,7 +135,7 @@ jobs:
run: v run ci/linux_ci.vsh test_vlib_skip_unused_gcc run: v run ci/linux_ci.vsh test_vlib_skip_unused_gcc
clang: clang:
runs-on: ubuntu-20.04 runs-on: ubuntu-24.04
timeout-minutes: 121 timeout-minutes: 121
env: env:
VFLAGS: -cc clang VFLAGS: -cc clang

View file

@ -17,7 +17,7 @@ on:
- '!cmd/tools/builders/**.v' - '!cmd/tools/builders/**.v'
concurrency: concurrency:
group: ${{ github.workflow }}-${{ github.ref == 'refs/heads/master' && github.sha || github.ref }} group: macos-${{ github.workflow }}-${{ github.ref == 'refs/heads/master' && github.sha || github.ref }}
cancel-in-progress: true cancel-in-progress: true
jobs: jobs:

View file

@ -17,12 +17,12 @@ on:
# Allow only one concurrent deployment, skipping runs queued between the run in-progress and latest queued. # Allow only one concurrent deployment, skipping runs queued between the run in-progress and latest queued.
# However, do NOT cancel in-progress runs as we want to allow these production deployments to complete. # However, do NOT cancel in-progress runs as we want to allow these production deployments to complete.
concurrency: concurrency:
group: ${{ github.workflow }}-${{ github.ref }} group: module_docs-${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: ${{ !contains(github.ref, 'master')}} cancel-in-progress: ${{ !contains(github.ref, 'master')}}
jobs: jobs:
build-module-docs: build-module-docs:
runs-on: ubuntu-20.04 runs-on: ubuntu-24.04
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
- name: Build V - name: Build V

View file

@ -17,7 +17,7 @@ on:
- 'cmd/tools/**' - 'cmd/tools/**'
concurrency: concurrency:
group: ${{ github.workflow }}-${{ github.ref == 'refs/heads/master' && github.sha || github.ref }} group: slower_tests-${{ github.workflow }}-${{ github.ref == 'refs/heads/master' && github.sha || github.ref }}
cancel-in-progress: true cancel-in-progress: true
jobs: jobs:

View file

@ -45,7 +45,7 @@ on:
- '.github/workflows/native_backend_ci.yml' - '.github/workflows/native_backend_ci.yml'
concurrency: concurrency:
group: ${{ github.workflow }}-${{ github.ref == 'refs/heads/master' && github.sha || github.ref }} group: native_backend-${{ github.workflow }}-${{ github.ref == 'refs/heads/master' && github.sha || github.ref }}
cancel-in-progress: true cancel-in-progress: true
jobs: jobs:

View file

@ -18,12 +18,12 @@ on:
- '!cmd/tools/builders/**.v' - '!cmd/tools/builders/**.v'
concurrency: concurrency:
group: ${{ github.workflow }}-${{ github.ref == 'refs/heads/master' && github.sha || github.ref }} group: other-${{ github.workflow }}-${{ github.ref == 'refs/heads/master' && github.sha || github.ref }}
cancel-in-progress: true cancel-in-progress: true
jobs: jobs:
prevent-gpl-licenses: prevent-gpl-licenses:
runs-on: ubuntu-20.04 runs-on: ubuntu-24.04
timeout-minutes: 15 timeout-minutes: 15
steps: steps:
- name: Checkout V ${{ github.head_ref }} - name: Checkout V ${{ github.head_ref }}
@ -46,7 +46,7 @@ jobs:
diff -d -a -U 2 --color=always gpl_res_vmaster gpl_res_vnew diff -d -a -U 2 --color=always gpl_res_vmaster gpl_res_vnew
code-formatting: code-formatting:
runs-on: ubuntu-20.04 runs-on: ubuntu-24.04
timeout-minutes: 30 timeout-minutes: 30
env: env:
VFLAGS: -cc gcc VFLAGS: -cc gcc
@ -62,7 +62,7 @@ jobs:
run: ./v test-fmt run: ./v test-fmt
performance-regressions: performance-regressions:
runs-on: ubuntu-20.04 runs-on: ubuntu-24.04
timeout-minutes: 30 timeout-minutes: 30
env: env:
VFLAGS: -cc gcc VFLAGS: -cc gcc
@ -86,7 +86,7 @@ jobs:
run: ./v repeat --max_time 1731 --series 3 --runs 20 --nmins 2 --nmaxs 5 --warmup 3 --fail_percent 10 -t 'cd {T} ; ./v -o v.c cmd/v' . ./vmaster run: ./v repeat --max_time 1731 --series 3 --runs 20 --nmins 2 --nmaxs 5 --warmup 3 --fail_percent 10 -t 'cd {T} ; ./v -o v.c cmd/v' . ./vmaster
misc-tooling: misc-tooling:
runs-on: ubuntu-20.04 runs-on: ubuntu-24.04
timeout-minutes: 121 timeout-minutes: 121
env: env:
VFLAGS: -cc tcc -no-retry-compilation VFLAGS: -cc tcc -no-retry-compilation
@ -124,7 +124,7 @@ jobs:
./v should-compile-all examples/sokol/*.v examples/sokol/0?*/*.v ./v should-compile-all examples/sokol/*.v examples/sokol/0?*/*.v
parser-silent: parser-silent:
runs-on: ubuntu-20.04 runs-on: ubuntu-24.04
timeout-minutes: 121 timeout-minutes: 121
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4

View file

@ -11,12 +11,12 @@ on:
- '!**/paths_ci.yml' - '!**/paths_ci.yml'
concurrency: concurrency:
group: ${{ github.workflow }}-${{ github.ref == 'refs/heads/master' && github.sha || github.ref }} group: paths-${{ github.workflow }}-${{ github.ref == 'refs/heads/master' && github.sha || github.ref }}
cancel-in-progress: true cancel-in-progress: true
jobs: jobs:
space-paths-linux: space-paths-linux:
runs-on: ubuntu-20.04 runs-on: ubuntu-24.04
timeout-minutes: 30 timeout-minutes: 30
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4

View file

@ -7,7 +7,7 @@ on:
jobs: jobs:
ubuntu: ubuntu:
runs-on: ubuntu-20.04 runs-on: ubuntu-24.04
timeout-minutes: 5 timeout-minutes: 5
steps: steps:
- name: Download V - name: Download V

View file

@ -20,13 +20,13 @@ on:
- '!**.md' - '!**.md'
concurrency: concurrency:
group: ${{ github.workflow }}-${{ github.ref == 'refs/heads/master' && github.sha || github.ref }} group: puzzle_vibes-${{ github.workflow }}-${{ github.ref == 'refs/heads/master' && github.sha || github.ref }}
cancel-in-progress: true cancel-in-progress: true
jobs: jobs:
v-compiles-puzzle-vibes: v-compiles-puzzle-vibes:
runs-on: ubuntu-20.04 runs-on: ubuntu-24.04
timeout-minutes: 10 timeout-minutes: 30
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
- name: Build V - name: Build V

View file

@ -13,7 +13,7 @@ on:
- 0.** - 0.**
concurrency: concurrency:
group: ${{ github.workflow }}-${{ github.ref }} group: release-${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: ${{ github.ref_type != 'tag' }} cancel-in-progress: ${{ github.ref_type != 'tag' }}
permissions: permissions:

View file

@ -1,4 +1,187 @@
## See https://clang.llvm.org/docs/UndefinedBehaviorSanitizer.html ## See https://clang.llvm.org/docs/UndefinedBehaviorSanitizer.html
## Most of the supressed functions here use asserts, that in turn use an indirection through an interface. TODO: if that is solved, most of these can be removed.
## Usually they contain a __test_ in their name, but not always (see the x.ttf ones like vlib/x/ttf/ttf_test.v ).
## TODO: extract the common part of the assertions to a VDO_ function (1 for pass and 1 for failure), so that they can be whitelisted here just once.
function:map_exists
function:map_get
function:IError_str
shift-exponent:math__bits__rotate_left_64
shift-exponent:math__bits__div_64
function:math__big__Integer_general_radix_str
function:math__big__Integer_div_mod_internal
function:math__bits__test_bits
function:math__bits__test_div_64_edge_cases
function:math__test_nan
alignment:rand__read_64
function:rand__internal_ulid_at_millisecond function:rand__internal_ulid_at_millisecond
function:sync__pool__process_in_thread function:rand__internal_string_from_set
function:rand__internal_uuid_v4
function:rand__deinit function:rand__deinit
function:rand__read_internal
function:rand__read_64
function:rand__PRNG_f64
function:rand__cuid2__test_cuid2
function:sync__pool__process_in_thread
function:sync__Once_do_slow_with_param
function:v__type_resolver__TypeResolver_resolve_fn_generic_args
function:v__type_resolver__TypeResolver_unwrap_generic_expr
function:v__type_resolver__TypeResolver_get_type
## these have asserts in them, and trigger due to the used indirection; TODO: remove them, when a more general solution is found for all interfaces
function:x__ttf__TTF_File_get_glyph_offset
function:x__ttf__TTF_File_get_horizontal_metrics
function:x__ttf__TTF_File_glyph_count
function:x__ttf__TTF_File_read_glyph
function:x__ttf__TTF_File_read_simple_glyph
function:x__ttf__TTF_File_read_kern_table
function:x__ttf__TTF_File_read_hhea_table
function:x__ttf__TTF_File_read_cmap_table
function:x__ttf__TTF_File_read_name_table
function:x__ttf__TTF_File_read_head_table
function:x__ttf__TTF_File_read_offset_tables
function:net__unix__select_deadline
function:net__select_deadline
function:net__socks__test_parse_ipv4
function:net__http__download_file_with_progress
function:net__http__download_progres_cb
function:net__http__check_headers
function:net__http__test_str
function:net__http__test_int
function:net__http__test_is_valid
function:net__http__test_is_error
function:net__http__test_is_success
function:net__http__test_parse_response_with_weird_cookie
function:net__http__test_parse_response_with_cookies
function:net__http__test_parse_response
function:net__http__test_response_bytestr_1
function:net__http__test_response_bytestr_2
function:net__http__test_parse_large_body
function:net__http__test_multipart_form_body
function:net__http__test_parse_multipart_form2
function:net__http__test_parse_request_no_headers
function:net__http__test_parse_multipart_form
function:net__http__test_parse_form
function:net__http__test_parse_request_line
function:net__http__test_parse_request_body
function:net__http__test_parse_request_two_header_values
function:net__http__test_parse_request_no_headers
function:net__http__test_parse_request_two_headers
function:net__http__test_proxy_fields
function:net__http__test_proxy_headers
function:net__http__test_set_cookie
function:net__http__test_parse_headers
function:net__http__parse_headers_test
function:net__http__test_header_join
function:net__http__test_header_from_map
function:net__http__test_custom_header_from_map
function:net__http__test_render_coerce_canonicalize
function:net__http__test_render_canonicalize
function:net__http__test_render_version
function:net__http__test_coerce_canonicalize_custom
function:net__http__test_coerce_custom
function:net__http__test_coerce_canonicalize
function:net__http__test_coerce
function:net__http__test_custom_values
function:net__http__test_starting_with
function:net__http__test_get_custom
function:net__http__test_contains_custom
function:net__http__test_custom_header
function:net__http__test_delete_header
function:net__http__test_header_delete_not_existing
function:net__http__test_header_delete
function:net__http__test_header_set
function:net__http__test_header_get
function:net__http__test_header_adds_multiple
function:net__http__test_header_new
function:net__test_ip6_str
function:net__test_ip_str
function:net__test_sizes_unix
function:net__test_sizes_ipv4
function:net__test_sizes_ipv6
function:net__test_offsets_unix
function:net__test_offsets_ipv4
function:net__test_offsets_ipv6
function:net__test_sizes_unix_sun_path
function:net__test_diagnostics
function:net__test_ip_port
function:net__websocket__delete_client_cb
function:net__websocket__Server_listen
function:net__websocket__Server_serve_client
function:net__websocket__Server_parse_client_handshake
function:net__websocket__Client_listen
function:net__websocket__Client_send_message_event
function:net__websocket__Client_send_close_event
function:net__websocket__Client_debug_log
function:net__websocket__Client_connect
function:io__BufferedReader_fill_buffer
function:io__read_all
function:log__info
function:log__debug
function:log__warn
function:log__error
function:log__set_level
function:log__Log_log_stream
function:log__free_logger
function:picoev__Picoev_poll_once
function:picoev__Picoev_set_timeout
function:picoev__Picoev_update_events
function:picoev__test_if_all_file_descriptors_are_properly_initialized
function:vweb__tests__vweb_test_server__App_index
function:vweb__tests__vweb_test_server__start_in_background
function:vweb__RoutePair_test_param
function:veb__RoutePair_test_param
function:veb__test_load_files_translations
## needed for tests; TODO: move the test specific setup code into its own separate VDO_tests function, so only it can be added here
function:main
function:crypto__sha3__test_0_length_hash
function:crypto__sha3__test_0_length_xof
function:crypto__sha3__test_200_length_hash
function:crypto__sha3__test_200_length_xof
function:crypto__sha3__test_2_x_24_rounds_on_zero
function:crypto__sha3__test_stepping_functions_on_zero
function:crypto__sha3__test_zero_state
function:crypto__sha3__test_rho_offsets
function:crypto__sha3__test_to_from_bytes
function:crypto__sha3__test_round_constants
function:crypto__pem__test_decode_rfc1421
function:crypto__pem__test_decode
function:crypto__pem__test_encode_rfc1421
function:crypto__pem__test_encode
function:crypto__hmac__test_hmac_equal
function:crypto__hmac__test_hmac_sha3_224
function:crypto__hmac__test_hmac_sha3_256
function:crypto__hmac__test_hmac_sha3_384
function:crypto__hmac__test_hmac_sha3_512
function:crypto__hmac__test_hmac_blake3_256
function:crypto__hmac__test_hmac_blake2b_160
function:crypto__hmac__test_hmac_blake2b_256
function:crypto__hmac__test_hmac_blake2b_384
function:crypto__hmac__test_hmac_blake2b_512
function:crypto__hmac__test_hmac_blake2s_128
function:crypto__hmac__test_hmac_blake2s_160
function:crypto__hmac__test_hmac_blake2s_224
function:crypto__hmac__test_hmac_blake2s_256
function:crypto__hmac__test_hmac_sha512
function:crypto__hmac__test_hmac_sha384
function:crypto__hmac__test_hmac_sha256
function:crypto__hmac__test_hmac_sha224
function:crypto__hmac__test_hmac_sha1
function:crypto__hmac__test_hmac_md5
function:crypto__ed25519__internal__edwards25519__sc_reduce
function:crypto__ed25519__internal__edwards25519__sc_reduce

View file

@ -71,17 +71,18 @@ on:
- '**/sanitized_ci.yml' - '**/sanitized_ci.yml'
concurrency: concurrency:
group: ${{ github.workflow }}-${{ github.ref == 'refs/heads/master' && github.sha || github.ref }} group: sanitized-${{ github.workflow }}-${{ github.ref == 'refs/heads/master' && github.sha || github.ref }}
cancel-in-progress: true cancel-in-progress: true
jobs: jobs:
tests-sanitize-undefined-clang: tests-sanitize-undefined-clang:
runs-on: ubuntu-20.04 runs-on: ubuntu-22.04
timeout-minutes: 120 timeout-minutes: 120
env: env:
VFLAGS: -cc clang VFLAGS: -cc clang -cflags -fno-omit-frame-pointer
VJOBS: 1 VJOBS: 1
VTEST_SHOW_START: 1 UBSAN_OPTIONS: print_stacktrace=1:halt_on_error=1:print_suppressions=0:suppressions=/home/runner/work/v/v/.github/workflows/run_sanitizers_undefined.suppressions
VNATIVE_SKIP_LIBC_VV: 1
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
- name: Build V - name: Build V
@ -97,17 +98,20 @@ jobs:
- name: Recompile V with -cstrict - name: Recompile V with -cstrict
run: ./v -cg -cstrict -o v cmd/v run: ./v -cg -cstrict -o v cmd/v
- name: Self tests (-fsanitize=undefined) - name: Self tests (-fsanitize=undefined)
run: ./v -cflags "-fsanitize=undefined" -o v2 cmd/v && ./v2 -cflags -fsanitize=undefined test-self vlib run: |
./v -cflags -fsanitize=undefined -o v2 cmd/v
./v2 -cflags -fsanitize=undefined test-self vlib
- name: Build examples (V compiled with -fsanitize=undefined) - name: Build examples (V compiled with -fsanitize=undefined)
run: ./v2 build-examples run: ./v2 build-examples
tests-sanitize-undefined-gcc: tests-sanitize-undefined-gcc:
runs-on: ubuntu-20.04 runs-on: ubuntu-22.04
timeout-minutes: 120 timeout-minutes: 120
env: env:
VFLAGS: -cc gcc VFLAGS: -cc gcc -cflags -fno-omit-frame-pointer
VJOBS: 1 VJOBS: 1
VTEST_SHOW_START: 1 UBSAN_OPTIONS: print_stacktrace=1:halt_on_error=1:print_suppressions=0:suppressions=/home/runner/work/v/v/.github/workflows/run_sanitizers_undefined.suppressions
VNATIVE_SKIP_LIBC_VV: 1
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
- name: Build V - name: Build V
@ -122,17 +126,21 @@ jobs:
- name: Recompile V with -cstrict - name: Recompile V with -cstrict
run: ./v -cg -cstrict -o v cmd/v run: ./v -cg -cstrict -o v cmd/v
- name: Self tests (-fsanitize=undefined) - name: Self tests (-fsanitize=undefined)
run: ./v -cflags "-fsanitize=undefined" -o v2 cmd/v && ./v2 -cflags -fsanitize=undefined test-self vlib run: |
./v -cflags -fsanitize=undefined -o v2 cmd/v
./v2 -cflags -fsanitize=undefined test-self vlib
- name: Build examples (V compiled with -fsanitize=undefined) - name: Build examples (V compiled with -fsanitize=undefined)
run: ./v2 build-examples run: ./v2 build-examples
tests-sanitize-address-clang: tests-sanitize-address-clang:
runs-on: ubuntu-20.04 runs-on: ubuntu-22.04
timeout-minutes: 300 timeout-minutes: 300
env: env:
VFLAGS: -cc clang VFLAGS: -cc clang -cflags -fno-omit-frame-pointer
VJOBS: 1 VJOBS: 1
VTEST_SHOW_START: 1 ASAN_OPTIONS: detect_leaks=1
LSAN_OPTIONS: max_leaks=1:print_suppressions=0:suppressions=/home/runner/work/v/v/.github/workflows/run_sanitizers_leak.suppressions
VNATIVE_SKIP_LIBC_VV: 1
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
- name: Build V - name: Build V
@ -148,12 +156,13 @@ jobs:
- name: Recompile V with -cstrict - name: Recompile V with -cstrict
run: ./v -cg -cstrict -o v cmd/v run: ./v -cg -cstrict -o v cmd/v
- name: Self tests (-fsanitize=address) - name: Self tests (-fsanitize=address)
run: ASAN_OPTIONS=detect_leaks=1 LSAN_OPTIONS=max_leaks=1:print_suppressions=0:suppressions=.github/workflows/run_sanitizers_leak.suppressions ./v -cflags "-fsanitize=address,pointer-compare,pointer-subtract" test-self vlib run: ./v -cflags -fsanitize=address,pointer-compare,pointer-subtract test-self vlib
- name: Self tests (V compiled with -fsanitize=address) - name: Self tests (V compiled with -fsanitize=address)
run: ./v -cflags -fsanitize=address -o v cmd/v && run: |
ASAN_OPTIONS=detect_leaks=1 LSAN_OPTIONS=max_leaks=1:print_suppressions=0:suppressions=.github/workflows/run_sanitizers_leak.suppressions ./v -cc tcc test-self -asan-compiler vlib ./v -cflags -fsanitize=address -o v cmd/v
./v -cc tcc test-self -asan-compiler vlib
- name: Build examples (V compiled with -fsanitize=address) - name: Build examples (V compiled with -fsanitize=address)
run: ASAN_OPTIONS=detect_leaks=1 LSAN_OPTIONS=max_leaks=1:print_suppressions=0:suppressions=.github/workflows/run_sanitizers_leak.suppressions ./v build-examples run: ./v build-examples
tests-sanitize-address-msvc: tests-sanitize-address-msvc:
runs-on: windows-2019 runs-on: windows-2019
@ -161,7 +170,7 @@ jobs:
env: env:
VFLAGS: -cc msvc VFLAGS: -cc msvc
VJOBS: 1 VJOBS: 1
VTEST_SHOW_START: 1 VNATIVE_SKIP_LIBC_VV: 1
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
- name: Build - name: Build
@ -180,12 +189,14 @@ jobs:
# run: .\v.exe -cflags "/fsanitize=address" test-self vlib # run: .\v.exe -cflags "/fsanitize=address" test-self vlib
tests-sanitize-address-gcc: tests-sanitize-address-gcc:
runs-on: ubuntu-20.04 runs-on: ubuntu-22.04
timeout-minutes: 300 timeout-minutes: 300
env: env:
VFLAGS: -cc gcc VFLAGS: -cc gcc -cflags -fno-omit-frame-pointer
VJOBS: 1 VJOBS: 1
VTEST_SHOW_START: 1 ASAN_OPTIONS: detect_leaks=1
LSAN_OPTIONS: max_leaks=1:print_suppressions=0:suppressions=/home/runner/work/v/v/.github/workflows/run_sanitizers_leak.suppressions
VNATIVE_SKIP_LIBC_VV: 1
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
- name: Build V - name: Build V
@ -201,21 +212,21 @@ jobs:
- name: Recompile V with -cstrict - name: Recompile V with -cstrict
run: ./v -cg -cstrict -o v cmd/v run: ./v -cg -cstrict -o v cmd/v
- name: Self tests (-fsanitize=address) - name: Self tests (-fsanitize=address)
run: ASAN_OPTIONS=detect_leaks=1 LSAN_OPTIONS=max_leaks=1:print_suppressions=0:suppressions=.github/workflows/run_sanitizers_leak.suppressions ./v -cflags -fsanitize=address test-self vlib run: ./v -cflags -fsanitize=address test-self vlib
- name: Self tests (V compiled with -fsanitize=address) - name: Self tests (V compiled with -fsanitize=address)
run: run: |
./v -cflags -fsanitize=address,pointer-compare,pointer-subtract -o v cmd/v && ./v -cflags -fsanitize=address,pointer-compare,pointer-subtract -o v cmd/v
ASAN_OPTIONS=detect_leaks=1 LSAN_OPTIONS=max_leaks=1:print_suppressions=0:suppressions=.github/workflows/run_sanitizers_leak.suppressions ./v -cc tcc test-self -asan-compiler vlib ./v -cc tcc test-self -asan-compiler vlib
- name: Build examples (V compiled with -fsanitize=address) - name: Build examples (V compiled with -fsanitize=address)
run: ASAN_OPTIONS=detect_leaks=1 LSAN_OPTIONS=max_leaks=1:print_suppressions=0:suppressions=.github/workflows/run_sanitizers_leak.suppressions ./v build-examples run: ./v build-examples
tests-sanitize-memory-clang: tests-sanitize-memory-clang:
runs-on: ubuntu-20.04 runs-on: ubuntu-22.04
timeout-minutes: 240 timeout-minutes: 240
env: env:
VFLAGS: -cc clang -gc none VFLAGS: -cc clang -gc none -cflags -fno-omit-frame-pointer
VJOBS: 1 VJOBS: 1
VTEST_SHOW_START: 1 VNATIVE_SKIP_LIBC_VV: 1
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
- name: Build V - name: Build V
@ -231,7 +242,7 @@ jobs:
- name: Recompile V with clang and -cstrict - name: Recompile V with clang and -cstrict
run: ./v -cc clang -cg -cstrict -o v cmd/v run: ./v -cc clang -cg -cstrict -o v cmd/v
- name: Self tests (-fsanitize=memory) - name: Self tests (-fsanitize=memory)
run: ./v -cflags -fsanitize=memory test-self vlib run: ./v -cflags -fsanitize=memory test-self -msan-compiler vlib
- name: Self tests (V compiled with -fsanitize=memory) - name: Self tests (V compiled with -fsanitize=memory)
run: | run: |
./v -cflags -fsanitize=memory -o v cmd/v ./v -cflags -fsanitize=memory -o v cmd/v

View file

@ -20,12 +20,12 @@ on:
- '!**.md' - '!**.md'
concurrency: concurrency:
group: ${{ github.workflow }}-${{ github.ref == 'refs/heads/master' && github.sha || github.ref }} group: sdl-${{ github.workflow }}-${{ github.ref == 'refs/heads/master' && github.sha || github.ref }}
cancel-in-progress: true cancel-in-progress: true
jobs: jobs:
v-compiles-sdl-examples: v-compiles-sdl-examples:
runs-on: ubuntu-20.04 runs-on: ubuntu-24.04
timeout-minutes: 30 timeout-minutes: 30
env: env:
VFLAGS: -cc tcc VFLAGS: -cc tcc

View file

@ -12,7 +12,7 @@ on:
- '.github/workflows/symlink_ci.yml' - '.github/workflows/symlink_ci.yml'
concurrency: concurrency:
group: ${{ github.workflow }}-${{ github.ref_name == 'master' && github.sha || github.ref_name }} group: symlink-${{ github.workflow }}-${{ github.ref_name == 'master' && github.sha || github.ref_name }}
cancel-in-progress: true cancel-in-progress: true
jobs: jobs:

View file

@ -15,7 +15,7 @@ on:
- '!**.md' - '!**.md'
concurrency: concurrency:
group: ${{ github.workflow }}-${{ github.ref == 'refs/heads/master' && github.sha || github.ref }} group: time-${{ github.workflow }}-${{ github.ref == 'refs/heads/master' && github.sha || github.ref }}
cancel-in-progress: true cancel-in-progress: true
jobs: jobs:

View file

@ -13,7 +13,7 @@ on:
- '!**.md' - '!**.md'
concurrency: concurrency:
group: ${{ github.workflow }}-${{ github.ref == 'refs/heads/master' && github.sha || github.ref }} group: toml-${{ github.workflow }}-${{ github.ref == 'refs/heads/master' && github.sha || github.ref }}
cancel-in-progress: true cancel-in-progress: true
jobs: jobs:

View file

@ -19,12 +19,12 @@ on:
- '**/tools_ci.yml' - '**/tools_ci.yml'
concurrency: concurrency:
group: ${{ github.workflow }}-${{ github.ref == 'refs/heads/master' && github.sha || github.ref }} group: tools-${{ github.workflow }}-${{ github.ref == 'refs/heads/master' && github.sha || github.ref }}
cancel-in-progress: true cancel-in-progress: true
jobs: jobs:
linux: linux:
runs-on: ubuntu-20.04 runs-on: ubuntu-22.04
strategy: strategy:
matrix: matrix:
cc: [tcc, gcc, clang] cc: [tcc, gcc, clang]
@ -47,19 +47,19 @@ jobs:
- name: Test sanitized - name: Test sanitized
if: ${{ matrix.cc != 'tcc' }} if: ${{ matrix.cc != 'tcc' }}
run: | run: |
export VNATIVE_SKIP_LIBC_VV=1
if [[ ${{ matrix.cc }} == "clang" ]]; then if [[ ${{ matrix.cc }} == "clang" ]]; then
cmd="./v -cc clang -cflags -fsanitize=undefined test-self cmd" cmd="./v -cc clang -cflags -fsanitize=undefined test-self -ubsan-compiler cmd"
echo $cmd && $cmd echo $cmd && $cmd
cmd="./v -cc clang -cflags -fsanitize=memory test-self cmd" cmd="./v -cc clang -cflags -fsanitize=memory test-self -msan-compiler cmd"
echo $cmd && $cmd echo $cmd && $cmd
else else
# TODO: enable thread sanitizer after switching to ubuntu-22.04. Ref. https://github.com/orgs/community/discussions/63391 cmd="./v -cc gcc -cflags -fsanitize=thread test-self cmd"
# cmd="./v -cc gcc -cflags -fsanitize=thread test-self cmd"
# echo $cmd && $cmd
cmd="./v -cc gcc -cflags -fsanitize=address,leak,undefined,shift,shift-exponent,shift-base,integer-divide-by-zero,unreachable,vla-bound,null,return,signed-integer-overflow,bounds,bounds-strict,alignment,object-size,float-divide-by-zero,float-cast-overflow,nonnull-attribute,returns-nonnull-attribute,bool,enum,vptr test-self cmd/tools"
echo $cmd && $cmd echo $cmd && $cmd
# cmd="./v -cc gcc -cflags -fsanitize=kernel-address test-self cmd" cmd="./v -cc gcc -cflags -fsanitize=address,leak,undefined,shift,shift-exponent,shift-base,integer-divide-by-zero,unreachable,vla-bound,null,return,signed-integer-overflow,bounds,bounds-strict,alignment,object-size,float-divide-by-zero,float-cast-overflow,nonnull-attribute,returns-nonnull-attribute,bool,enum,vptr test-self -asan-compiler cmd/tools"
# echo $cmd && $cmd echo $cmd && $cmd
## cmd="./v -cc gcc -cflags -fsanitize=kernel-address test-self -asan-compiler cmd"
## echo $cmd && $cmd
fi fi
macos: macos:
@ -102,7 +102,7 @@ jobs:
run: ./v -W -cstrict test-self cmd run: ./v -W -cstrict test-self cmd
tools-docker-ubuntu-musl: tools-docker-ubuntu-musl:
runs-on: ubuntu-20.04 runs-on: ubuntu-24.04
timeout-minutes: 121 timeout-minutes: 121
container: container:
image: thevlang/vlang:ubuntu-build image: thevlang/vlang:ubuntu-build

View file

@ -17,7 +17,7 @@ on:
- 'cmd/tools/vrepl.v' - 'cmd/tools/vrepl.v'
concurrency: concurrency:
group: ${{ github.workflow }}-${{ github.ref == 'refs/heads/master' && github.sha || github.ref }} group: v_apps-${{ github.workflow }}-${{ github.ref == 'refs/heads/master' && github.sha || github.ref }}
cancel-in-progress: true cancel-in-progress: true
jobs: jobs:

View file

@ -18,12 +18,12 @@ on:
- '!**.md' - '!**.md'
concurrency: concurrency:
group: ${{ github.workflow }}-${{ github.ref == 'refs/heads/master' && github.sha || github.ref }} group: vab-${{ github.workflow }}-${{ github.ref == 'refs/heads/master' && github.sha || github.ref }}
cancel-in-progress: true cancel-in-progress: true
jobs: jobs:
vab-compiles-v-examples: vab-compiles-v-examples:
runs-on: ubuntu-20.04 runs-on: ubuntu-24.04
timeout-minutes: 121 timeout-minutes: 121
env: env:
VAB_FLAGS: --api 30 --build-tools 29.0.0 -v 3 VAB_FLAGS: --api 30 --build-tools 29.0.0 -v 3
@ -65,7 +65,7 @@ jobs:
done done
v-compiles-os-android: v-compiles-os-android:
runs-on: ubuntu-20.04 runs-on: ubuntu-24.04
timeout-minutes: 20 timeout-minutes: 20
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4

View file

@ -18,12 +18,12 @@ on:
- 'cmd/tools/vrepl.v' - 'cmd/tools/vrepl.v'
concurrency: concurrency:
group: ${{ github.workflow }}-${{ github.ref == 'refs/heads/master' && github.sha || github.ref }} group: vinix-${{ github.workflow }}-${{ github.ref == 'refs/heads/master' && github.sha || github.ref }}
cancel-in-progress: true cancel-in-progress: true
jobs: jobs:
vinix-build: vinix-build:
runs-on: ubuntu-20.04 runs-on: ubuntu-24.04
timeout-minutes: 10 timeout-minutes: 10
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4

View file

@ -11,7 +11,7 @@ on:
- '**/cmd/tools/vpm/**' - '**/cmd/tools/vpm/**'
concurrency: concurrency:
group: ${{ github.workflow }}-${{ github.ref == 'refs/heads/master' && github.sha || github.ref }} group: vpm-${{ github.workflow }}-${{ github.ref == 'refs/heads/master' && github.sha || github.ref }}
cancel-in-progress: true cancel-in-progress: true
jobs: jobs:

View file

@ -17,7 +17,7 @@ on:
- 'cmd/tools/vrepl.v' - 'cmd/tools/vrepl.v'
concurrency: concurrency:
group: ${{ github.workflow }}-${{ github.ref == 'refs/heads/master' && github.sha || github.ref }} group: vsl-vtl-${{ github.workflow }}-${{ github.ref == 'refs/heads/master' && github.sha || github.ref }}
cancel-in-progress: true cancel-in-progress: true
jobs: jobs:

View file

@ -21,7 +21,7 @@ on:
- 'cmd/tools/vrepl.v' - 'cmd/tools/vrepl.v'
concurrency: concurrency:
group: ${{ github.workflow }}-${{ github.ref == 'refs/heads/master' && github.sha || github.ref }} group: vup-${{ github.workflow }}-${{ github.ref == 'refs/heads/master' && github.sha || github.ref }}
cancel-in-progress: true cancel-in-progress: true
jobs: jobs:

View file

@ -39,7 +39,7 @@ on:
- '**/wasm_backend_ci.yml' - '**/wasm_backend_ci.yml'
concurrency: concurrency:
group: ${{ github.workflow }}-${{ github.ref == 'refs/heads/master' && github.sha || github.ref }} group: wasm-${{ github.workflow }}-${{ github.ref == 'refs/heads/master' && github.sha || github.ref }}
cancel-in-progress: true cancel-in-progress: true
jobs: jobs:

View file

@ -17,12 +17,12 @@ on:
- '!cmd/tools/builders/**.v' - '!cmd/tools/builders/**.v'
concurrency: concurrency:
group: ${{ github.workflow }}-${{ github.ref == 'refs/heads/master' && github.sha || github.ref }} group: websockets-${{ github.workflow }}-${{ github.ref == 'refs/heads/master' && github.sha || github.ref }}
cancel-in-progress: true cancel-in-progress: true
jobs: jobs:
websocket_tests: websocket_tests:
runs-on: ubuntu-20.04 runs-on: ubuntu-24.04
timeout-minutes: 121 timeout-minutes: 121
env: env:
VFLAGS: -cc tcc -no-retry-compilation VFLAGS: -cc tcc -no-retry-compilation

View file

@ -20,7 +20,7 @@ on:
- '!cmd/tools/builders/**.v' - '!cmd/tools/builders/**.v'
concurrency: concurrency:
group: ${{ github.workflow }}-${{ github.ref == 'refs/heads/master' && github.sha || github.ref }} group: windows-${{ github.workflow }}-${{ github.ref == 'refs/heads/master' && github.sha || github.ref }}
cancel-in-progress: true cancel-in-progress: true
jobs: jobs:

View file

@ -60,10 +60,10 @@ fn install_dependencies_for_examples_and_tools_tcc() {
exec('v retry -- sudo apt install --quiet -y libssl-dev sqlite3 libsqlite3-dev valgrind') exec('v retry -- sudo apt install --quiet -y libssl-dev sqlite3 libsqlite3-dev valgrind')
exec('v retry -- sudo apt install --quiet -y libfreetype6-dev libxi-dev libxcursor-dev libgl-dev libxrandr-dev libasound2-dev') exec('v retry -- sudo apt install --quiet -y libfreetype6-dev libxi-dev libxcursor-dev libgl-dev libxrandr-dev libasound2-dev')
// The following is needed for examples/wkhtmltopdf.v // The following is needed for examples/wkhtmltopdf.v
exec('v retry -- wget https://github.com/wkhtmltopdf/packaging/releases/download/0.12.6-1/wkhtmltox_0.12.6-1.focal_amd64.deb') exec('v retry -- wget https://github.com/wkhtmltopdf/packaging/releases/download/0.12.6.1-2/wkhtmltox_0.12.6.1-2.jammy_amd64.deb')
exec('v retry -- sudo apt install --quiet -y xfonts-75dpi xfonts-base') exec('v retry -- sudo apt install --quiet -y xfonts-75dpi xfonts-base')
exec('v retry -- sudo apt install --quiet -y expect') exec('v retry -- sudo apt install --quiet -y expect')
exec('v retry -- sudo dpkg -i wkhtmltox_0.12.6-1.focal_amd64.deb') exec('v retry -- sudo dpkg -i wkhtmltox_0.12.6.1-2.jammy_amd64.deb')
} }
fn test_v_to_c_tcc() { fn test_v_to_c_tcc() {

View file

@ -4,6 +4,10 @@ const vexe = @VEXE
const vroot = os.dir(vexe) const vroot = os.dir(vexe)
const tfolder = os.join_path(os.vtmp_dir(), 'cover_test') const tfolder = os.join_path(os.vtmp_dir(), 'cover_test')
const t1 = np(os.join_path(tfolder, 't1'))
const t2 = np(os.join_path(tfolder, 't2'))
const t3 = np(os.join_path(tfolder, 't3'))
fn testsuite_begin() { fn testsuite_begin() {
os.setenv('VCOLORS', 'never', true) os.setenv('VCOLORS', 'never', true)
os.chdir(vroot)! os.chdir(vroot)!
@ -16,7 +20,7 @@ fn testsuite_end() {
} }
fn test_help() { fn test_help() {
res := os.execute('${os.quoted_path(vexe)} cover -h') res := execute('${os.quoted_path(vexe)} cover -h')
assert res.exit_code == 0 assert res.exit_code == 0
assert res.output.contains('Usage: v cover') assert res.output.contains('Usage: v cover')
assert res.output.contains('Description: Analyze & make reports') assert res.output.contains('Description: Analyze & make reports')
@ -34,27 +38,20 @@ fn np(path string) string {
} }
fn test_simple() { fn test_simple() {
// if true {
// return
//}
t1 := np(os.join_path(tfolder, 't1'))
t2 := np(os.join_path(tfolder, 't2'))
t3 := np(os.join_path(tfolder, 't3'))
assert !os.exists(t1), t1 assert !os.exists(t1), t1
assert !os.exists(t2), t2 assert !os.exists(t2), t2
assert !os.exists(t3), t3 assert !os.exists(t3), t3
r1 := os.execute('${os.quoted_path(vexe)} -no-skip-unused -coverage ${os.quoted_path(t1)} cmd/tools/vcover/testdata/simple/t1_test.v') r1 := execute('${os.quoted_path(vexe)} -no-skip-unused -coverage ${os.quoted_path(t1)} cmd/tools/vcover/testdata/simple/t1_test.v')
assert r1.exit_code == 0, r1.str() assert r1.exit_code == 0, r1.str()
assert r1.output.trim_space() == '10', r1.str() assert r1.output.trim_space() == '10', r1.str()
assert os.exists(t1), t1 assert os.exists(t1), t1
cmd := '${os.quoted_path(vexe)} cover ${os.quoted_path(t1)} --filter vcover/testdata/simple/' cmd := '${os.quoted_path(vexe)} cover ${os.quoted_path(t1)} --filter vcover/testdata/simple/'
filter1 := os.execute(cmd) filter1 := execute(cmd)
assert filter1.exit_code == 0, filter1.output assert filter1.exit_code == 0, filter1.output
assert filter1.output.contains('cmd/tools/vcover/testdata/simple/simple.v'), filter1.output assert filter1.output.contains('cmd/tools/vcover/testdata/simple/simple.v'), filter1.output
assert filter1.output.trim_space().ends_with('| 4 | 9 | 44.44%'), filter1.output assert filter1.output.trim_space().ends_with('| 4 | 9 | 44.44%'), filter1.output
hfilter1 := os.execute('${os.quoted_path(vexe)} cover ${os.quoted_path(t1)} --filter vcover/testdata/simple/ -H -P false') hfilter1 := execute('${os.quoted_path(vexe)} cover ${os.quoted_path(t1)} --filter vcover/testdata/simple/ -H -P false')
assert hfilter1.exit_code == 0, hfilter1.output assert hfilter1.exit_code == 0, hfilter1.output
assert !hfilter1.output.contains('%'), hfilter1.output assert !hfilter1.output.contains('%'), hfilter1.output
houtput1 := hfilter1.output.trim_space().split_into_lines() houtput1 := hfilter1.output.trim_space().split_into_lines()
@ -72,15 +69,15 @@ fn test_simple() {
assert nzeros1.any(it.contains('simple.v:8')), nzeros1.str() assert nzeros1.any(it.contains('simple.v:8')), nzeros1.str()
assert nzeros1.any(it.contains('simple.v:25')), nzeros1.str() assert nzeros1.any(it.contains('simple.v:25')), nzeros1.str()
r2 := os.execute('${os.quoted_path(vexe)} -no-skip-unused -coverage ${os.quoted_path(t2)} cmd/tools/vcover/testdata/simple/t2_test.v') r2 := execute('${os.quoted_path(vexe)} -no-skip-unused -coverage ${os.quoted_path(t2)} cmd/tools/vcover/testdata/simple/t2_test.v')
assert r2.exit_code == 0, r2.str() assert r2.exit_code == 0, r2.str()
assert r2.output.trim_space() == '24', r2.str() assert r2.output.trim_space() == '24', r2.str()
assert os.exists(t2), t2 assert os.exists(t2), t2
filter2 := os.execute('${os.quoted_path(vexe)} cover ${os.quoted_path(t2)} --filter vcover/testdata/simple') filter2 := execute('${os.quoted_path(vexe)} cover ${os.quoted_path(t2)} --filter vcover/testdata/simple')
assert filter2.exit_code == 0, filter2.output assert filter2.exit_code == 0, filter2.output
assert filter2.output.contains('cmd/tools/vcover/testdata/simple/simple.v') assert filter2.output.contains('cmd/tools/vcover/testdata/simple/simple.v')
assert filter2.output.trim_space().ends_with('| 6 | 9 | 66.67%'), filter2.output assert filter2.output.trim_space().ends_with('| 6 | 9 | 66.67%'), filter2.output
hfilter2 := os.execute('${os.quoted_path(vexe)} cover ${os.quoted_path(t2)} --filter testdata/simple -H -P false') hfilter2 := execute('${os.quoted_path(vexe)} cover ${os.quoted_path(t2)} --filter testdata/simple -H -P false')
assert hfilter2.exit_code == 0, hfilter2.output assert hfilter2.exit_code == 0, hfilter2.output
assert !hfilter2.output.contains('%'), hfilter2.output assert !hfilter2.output.contains('%'), hfilter2.output
houtput2 := hfilter2.output.trim_space().split_into_lines() houtput2 := hfilter2.output.trim_space().split_into_lines()
@ -97,12 +94,17 @@ fn test_simple() {
assert nzeros2.any(it.contains('simple.v:25')), nzeros2.str() assert nzeros2.any(it.contains('simple.v:25')), nzeros2.str()
// Run both tests. The coverage should be combined and == 100% // Run both tests. The coverage should be combined and == 100%
r3 := os.execute('${os.quoted_path(vexe)} -no-skip-unused -coverage ${os.quoted_path(t3)} test cmd/tools/vcover/testdata/simple/') r3 := execute('${os.quoted_path(vexe)} -no-skip-unused -coverage ${os.quoted_path(t3)} test cmd/tools/vcover/testdata/simple/')
assert r3.exit_code == 0, r3.str() assert r3.exit_code == 0, r3.str()
assert r3.output.trim_space().contains('Summary for all V _test.v files: '), r3.str() assert r3.output.trim_space().contains('Summary for all V _test.v files: '), r3.str()
assert os.exists(t3), t3 assert os.exists(t3), t3
filter3 := os.execute('${os.quoted_path(vexe)} cover ${os.quoted_path(t3)} --filter simple/') filter3 := execute('${os.quoted_path(vexe)} cover ${os.quoted_path(t3)} --filter simple/')
assert filter3.exit_code == 0, filter3.str() assert filter3.exit_code == 0, filter3.str()
assert filter3.output.contains('cmd/tools/vcover/testdata/simple/simple.v'), filter3.str() assert filter3.output.contains('cmd/tools/vcover/testdata/simple/simple.v'), filter3.str()
assert filter3.output.trim_space().match_glob('*cmd/tools/vcover/testdata/simple/simple.v *| 9 | 9 | 100.00%'), filter3.str() assert filter3.output.trim_space().match_glob('*cmd/tools/vcover/testdata/simple/simple.v *| 9 | 9 | 100.00%'), filter3.str()
} }
fn execute(cmd string) os.Result {
eprintln('Executing: ${cmd}')
return os.execute(cmd)
}

View file

@ -14,6 +14,7 @@ mut:
test_dirs []string = ['cmd', 'vlib'] test_dirs []string = ['cmd', 'vlib']
is_asan_compiler bool is_asan_compiler bool
is_msan_compiler bool is_msan_compiler bool
is_ubsan_compiler bool
// Options relating to the v command itself (passed in the prefix) `v [...args] test-self`. // Options relating to the v command itself (passed in the prefix) `v [...args] test-self`.
werror bool werror bool
sanitize_memory bool sanitize_memory bool
@ -234,6 +235,9 @@ const skip_with_asan_compiler = [
const skip_with_msan_compiler = [ const skip_with_msan_compiler = [
'do_not_remove', 'do_not_remove',
] ]
const skip_with_ubsan_compiler = [
'do_not_remove',
]
const skip_on_musl = [ const skip_on_musl = [
'do_not_remove', 'do_not_remove',
'vlib/v/slow_tests/profile/profile_test.v', 'vlib/v/slow_tests/profile/profile_test.v',
@ -396,6 +400,9 @@ fn Config.init(vargs []string, targs []string) !Config {
'-msan-compiler', '--msan-compiler' { '-msan-compiler', '--msan-compiler' {
cfg.is_msan_compiler = true cfg.is_msan_compiler = true
} }
'-ubsan-compiler', '--ubsan-compiler' {
cfg.is_ubsan_compiler = true
}
else { else {
if arg.starts_with('-') { if arg.starts_with('-') {
errs << 'error: unknown flag `${arg}`' errs << 'error: unknown flag `${arg}`'
@ -465,7 +472,7 @@ fn main() {
} }
if !cfg.run_slow_sanitize if !cfg.run_slow_sanitize
&& ((cfg.sanitize_undefined || cfg.sanitize_memory || cfg.sanitize_address) && ((cfg.sanitize_undefined || cfg.sanitize_memory || cfg.sanitize_address)
|| (cfg.is_msan_compiler || cfg.is_asan_compiler)) { || (cfg.is_msan_compiler || cfg.is_asan_compiler || cfg.is_ubsan_compiler)) {
tsession.skip_files << skip_fsanitize_too_slow tsession.skip_files << skip_fsanitize_too_slow
} }
if cfg.werror { if cfg.werror {
@ -486,6 +493,9 @@ fn main() {
if cfg.is_msan_compiler { if cfg.is_msan_compiler {
tsession.skip_files << skip_with_msan_compiler tsession.skip_files << skip_with_msan_compiler
} }
if cfg.is_ubsan_compiler {
tsession.skip_files << skip_with_ubsan_compiler
}
if cfg.is_musl_ci { if cfg.is_musl_ci {
tsession.skip_files << skip_on_musl tsession.skip_files << skip_on_musl
} }

View file

@ -29,6 +29,9 @@ pub fn vmemcpy(dest voidptr, const_src voidptr, n isize) voidptr {
print_backtrace() print_backtrace()
} }
} }
if n == 0 {
return dest
}
unsafe { unsafe {
return C.memcpy(dest, const_src, n) return C.memcpy(dest, const_src, n)
} }
@ -44,6 +47,9 @@ pub fn vmemmove(dest voidptr, const_src voidptr, n isize) voidptr {
$if trace_vmemmove ? { $if trace_vmemmove ? {
C.fprintf(C.stderr, c'vmemmove dest: %p src: %p n: %6ld\n', dest, const_src, n) C.fprintf(C.stderr, c'vmemmove dest: %p src: %p n: %6ld\n', dest, const_src, n)
} }
if n == 0 {
return dest
}
unsafe { unsafe {
return C.memmove(dest, const_src, n) return C.memmove(dest, const_src, n)
} }
@ -66,6 +72,9 @@ pub fn vmemcmp(const_s1 voidptr, const_s2 voidptr, n isize) int {
$if trace_vmemcmp ? { $if trace_vmemcmp ? {
C.fprintf(C.stderr, c'vmemcmp s1: %p s2: %p n: %6ld\n', const_s1, const_s2, n) C.fprintf(C.stderr, c'vmemcmp s1: %p s2: %p n: %6ld\n', const_s1, const_s2, n)
} }
if n == 0 {
return 0
}
unsafe { unsafe {
return C.memcmp(const_s1, const_s2, n) return C.memcmp(const_s1, const_s2, n)
} }
@ -85,6 +94,9 @@ pub fn vmemset(s voidptr, c int, n isize) voidptr {
print_backtrace() print_backtrace()
} }
} }
if n == 0 {
return s
}
unsafe { unsafe {
return C.memset(s, c, n) return C.memset(s, c, n)
} }

View file

@ -28,7 +28,11 @@ pub fn (mut d TerminalStreamingDownloader) on_chunk(request &Request, chunk []u8
d.past_time = now d.past_time = now
d.past_received = already_received d.past_received = already_received
ratio := f64(already_received) / f64(expected) ratio := f64(already_received) / f64(expected)
estimated := time.Duration(i64(f64(elapsed) / ratio)) res := f64(elapsed) / ratio
mut estimated := time.Duration(max_i64)
if f64(min_i64) < res && res < f64(max_i64) {
estimated = i64(res)
}
speed := f64(time.millisecond) * f64(already_received) / f64(elapsed) speed := f64(time.millisecond) * f64(already_received) / f64(elapsed)
elapsed_s := elapsed.seconds() elapsed_s := elapsed.seconds()
estimated_s := estimated.seconds() estimated_s := estimated.seconds()

View file

@ -206,12 +206,14 @@ fn (mut s Server) setup_callbacks(mut sc ServerClient) {
} }
} }
// set standard close so we can remove client if closed // set standard close so we can remove client if closed
sc.client.on_close_ref(fn (mut c Client, code int, reason string, mut sc ServerClient) ! { sc.client.on_close_ref(delete_client_cb, sc)
}
fn delete_client_cb(mut c Client, code int, reason string, mut sc ServerClient) ! {
c.logger.debug('server-> Delete client') c.logger.debug('server-> Delete client')
lock sc.server.server_state { lock sc.server.server_state {
sc.server.server_state.clients.delete(sc.client.id) sc.server.server_state.clients.delete(sc.client.id)
} }
}, sc)
} }
// accept_new_client creates a new client instance for client that connects to the socket // accept_new_client creates a new client instance for client that connects to the socket

View file

@ -87,23 +87,18 @@ fn start_server_in_thread_and_wait_till_it_is_ready_to_accept_connections(mut ws
eprintln('-----------------------------------------------------------------------------') eprintln('-----------------------------------------------------------------------------')
} }
// ws_test tests connect to the websocket server from websocket client fn open_cb(mut client websocket.Client) ! {
fn ws_test(family net.AddrFamily, uri string) ! {
eprintln('connecting to ${uri} ...')
mut test_results := WebsocketTestResults{}
mut client := websocket.new_client(uri)!
client.on_open(fn (mut client websocket.Client) ! {
client.pong()! client.pong()!
assert true assert true
}) }
client.on_error(fn (mut client websocket.Client, err string) ! {
fn close_cb(mut client websocket.Client, err string) ! {
println('error: ${err}') println('error: ${err}')
// this can be thrown by internet connection problems // this can be thrown by internet connection problems
assert false assert false
}) }
client.on_message_ref(fn (mut client websocket.Client, msg &websocket.Message, mut res WebsocketTestResults) ! { fn message_cb(mut client websocket.Client, msg &websocket.Message, mut res WebsocketTestResults) ! {
println('client got type: ${msg.opcode} payload:\n${msg.payload}') println('client got type: ${msg.opcode} payload:\n${msg.payload}')
if msg.opcode == .text_frame { if msg.opcode == .text_frame {
smessage := msg.payload.bytestr() smessage := msg.payload.bytestr()
@ -121,7 +116,17 @@ fn ws_test(family net.AddrFamily, uri string) ! {
} else { } else {
println('Binary message: ${msg}') println('Binary message: ${msg}')
} }
}, test_results) }
// ws_test tests connect to the websocket server from websocket client
fn ws_test(family net.AddrFamily, uri string) ! {
eprintln('connecting to ${uri} ...')
mut test_results := WebsocketTestResults{}
mut client := websocket.new_client(uri)!
client.on_open(open_cb)
client.on_error(close_cb)
client.on_message_ref(message_cb, test_results)
client.connect()! client.connect()!
spawn client.listen() spawn client.listen()
@ -140,17 +145,21 @@ fn ws_test(family net.AddrFamily, uri string) ! {
assert test_results.nr_messages == 2 assert test_results.nr_messages == 2
} }
fn test_on_close_when_server_closing_connection() ! { fn on_message_cb_2(mut cli websocket.Client, msg &websocket.Message) ! {
mut ws := websocket.new_server(.ip, 30003, '')
ws.on_message(fn (mut cli websocket.Client, msg &websocket.Message) ! {
if msg.opcode == .text_frame { if msg.opcode == .text_frame {
cli.close(1000, 'closing connection')! cli.close(1000, 'closing connection')!
} }
}) }
mut test_results := WebsocketTestResults{}
ws.on_close_ref(fn (mut cli websocket.Client, code int, reason string, mut res WebsocketTestResults) ! { fn on_close_cb_2(mut cli websocket.Client, code int, reason string, mut res WebsocketTestResults) ! {
res.nr_closes++ res.nr_closes++
}, test_results) }
fn test_on_close_when_server_closing_connection() ! {
mut ws := websocket.new_server(.ip, 30003, '')
ws.on_message(on_message_cb_2)
mut test_results := WebsocketTestResults{}
ws.on_close_ref(on_close_cb_2, test_results)
start_server_in_thread_and_wait_till_it_is_ready_to_accept_connections(mut ws) start_server_in_thread_and_wait_till_it_is_ready_to_accept_connections(mut ws)
mut client := websocket.new_client('ws://localhost:30003')! mut client := websocket.new_client('ws://localhost:30003')!
@ -162,15 +171,17 @@ fn test_on_close_when_server_closing_connection() ! {
assert test_results.nr_closes == 1 assert test_results.nr_closes == 1
} }
fn on_close_cb_3(mut cli websocket.Client, code int, reason string, mut res WebsocketTestResults) ! {
res.nr_closes++
}
fn test_on_close_when_client_closing_connection() ! { fn test_on_close_when_client_closing_connection() ! {
mut ws := websocket.new_server(.ip, 30004, '') mut ws := websocket.new_server(.ip, 30004, '')
start_server_in_thread_and_wait_till_it_is_ready_to_accept_connections(mut ws) start_server_in_thread_and_wait_till_it_is_ready_to_accept_connections(mut ws)
mut client := websocket.new_client('ws://localhost:30004')! mut client := websocket.new_client('ws://localhost:30004')!
mut test_results := WebsocketTestResults{} mut test_results := WebsocketTestResults{}
client.on_close_ref(fn (mut cli websocket.Client, code int, reason string, mut res WebsocketTestResults) ! { client.on_close_ref(on_close_cb_3, test_results)
res.nr_closes++
}, test_results)
client.connect()! client.connect()!
spawn client.listen() spawn client.listen()
time.sleep(1000 * time.millisecond) time.sleep(1000 * time.millisecond)

View file

@ -656,6 +656,7 @@ fn (mut c Checker) check_shift(mut node ast.InfixExpr, left_type_ ast.Type, righ
node.right.pos()) node.right.pos())
return left_type return left_type
} }
if !c.inside_unsafe {
if node.ct_left_value_evaled { if node.ct_left_value_evaled {
if lval := node.ct_left_value.i64() { if lval := node.ct_left_value.i64() {
if lval < 0 { if lval < 0 {
@ -664,6 +665,7 @@ fn (mut c Checker) check_shift(mut node ast.InfixExpr, left_type_ ast.Type, righ
} }
} }
} }
}
} else { } else {
// c.note('can not evaluate "$node.right" at comptime, err: $err', node.pos) // c.note('can not evaluate "$node.right" at comptime, err: $err', node.pos)
return left_type return left_type

View file

@ -5249,7 +5249,7 @@ fn (mut g Gen) ident(node ast.Ident) {
key := node.name key := node.name
g.write('/* obf identfn: ${key} */') g.write('/* obf identfn: ${key} */')
name = g.obf_table[key] or { name = g.obf_table[key] or {
panic('cgen: obf key name "${key}" not found, this should never happen') panic('cgen: obf name "${key}" not found, this should never happen')
} }
} }
} }

View file

@ -362,7 +362,11 @@ const c_common_macros = '
// for __offset_of // for __offset_of
#ifndef __offsetof #ifndef __offsetof
#if defined(__TINYC__) || defined(_MSC_VER)
#define __offsetof(PTYPE,FIELDNAME) ((size_t)(&((PTYPE *)0)->FIELDNAME)) #define __offsetof(PTYPE,FIELDNAME) ((size_t)(&((PTYPE *)0)->FIELDNAME))
#else
#define __offsetof(st, m) __builtin_offsetof(st, m)
#endif
#endif #endif
#define OPTION_CAST(x) (x) #define OPTION_CAST(x) (x)

View file

@ -34,6 +34,13 @@ fn test_native() {
} }
bench.set_total_expected_steps(tests.len) bench.set_total_expected_steps(tests.len)
for test in tests { for test in tests {
if test == 'libc.vv' {
// TODO: remove the skip here, when the native backend is more advanced
if os.getenv('VNATIVE_SKIP_LIBC_VV') != '' {
println('>>> SKIPPING ${test} since VNATIVE_SKIP_LIBC_VV is defined')
continue
}
}
bench.step() bench.step()
full_test_path := os.real_path(os.join_path(dir, test)) full_test_path := os.real_path(os.join_path(dir, test))
test_file_name := os.file_name(test) test_file_name := os.file_name(test)
@ -41,7 +48,7 @@ fn test_native() {
work_test_path := os.join_path(wrkdir, test_file_name) work_test_path := os.join_path(wrkdir, test_file_name)
exe_test_path := os.join_path(wrkdir, test_file_name + '.exe') exe_test_path := os.join_path(wrkdir, test_file_name + '.exe')
tmperrfile := os.join_path(dir, test + '.tmperr') tmperrfile := os.join_path(dir, test + '.tmperr')
cmd := '${os.quoted_path(vexe)} -o ${os.quoted_path(exe_test_path)} -b native -skip-unused ${os.quoted_path(full_test_path)} -d no_backtrace -d custom_define 2> ${os.quoted_path(tmperrfile)}' cmd := '${os.quoted_path(vexe)} -o ${os.quoted_path(exe_test_path)} -b native ${os.quoted_path(full_test_path)} -d no_backtrace -d custom_define 2> ${os.quoted_path(tmperrfile)}'
if is_verbose { if is_verbose {
println(cmd) println(cmd)
} }

View file

@ -925,7 +925,7 @@ pub fn (mut t Transformer) infix_expr(mut node ast.InfixExpr) ast.Expr {
} }
.left_shift { .left_shift {
return ast.IntegerLiteral{ return ast.IntegerLiteral{
val: (u32(left_val) << right_val).str() val: (unsafe { left_val << right_val }).str()
pos: pos pos: pos
} }
} }
@ -937,7 +937,7 @@ pub fn (mut t Transformer) infix_expr(mut node ast.InfixExpr) ast.Expr {
} }
.unsigned_right_shift { .unsigned_right_shift {
return ast.IntegerLiteral{ return ast.IntegerLiteral{
val: (left_val >>> right_val).str() val: (u64(left_val) >>> right_val).str()
pos: pos pos: pos
} }
} }

View file

@ -291,6 +291,7 @@ pub fn (mut bmp BitMap) aline(in_x0 int, in_y0 int, in_x1 int, in_y1 int, c u32)
mut y := y0 mut y := y0
for y <= y1 + 0.5 { for y <= y1 + 0.5 {
x := n * (y - y0) + x0 x := n * (y - y0) + x0
if !math.is_nan(x) && !math.is_nan(y) {
e := f32(1 - math.abs(x - 0.5 - int(x))) e := f32(1 - math.abs(x - 0.5 - int(x)))
bmp.plot(int(x), int(y), color_multiply_alpha(c, f32(e * 0.75))) bmp.plot(int(x), int(y), color_multiply_alpha(c, f32(e * 0.75)))
@ -305,6 +306,7 @@ pub fn (mut bmp BitMap) aline(in_x0 int, in_y0 int, in_x1 int, in_y1 int, c u32)
v2 := math.abs(x - xs1) / dist * (1 - e) v2 := math.abs(x - xs1) / dist * (1 - e)
bmp.plot(int(xs2), int(y), color_multiply_alpha(c, f32(v2))) bmp.plot(int(xs2), int(y), color_multiply_alpha(c, f32(v2)))
} }
}
y += 1.0 y += 1.0
} }
} }