Skip to content

cgen: fix pointer reference in for-in fixed-array iteration with & [fj4WqyCCw3C5ShR1RfB7MoBPTpkRrBFYP1uT35g3MvT] #20500

cgen: fix pointer reference in for-in fixed-array iteration with & [fj4WqyCCw3C5ShR1RfB7MoBPTpkRrBFYP1uT35g3MvT]

cgen: fix pointer reference in for-in fixed-array iteration with & [fj4WqyCCw3C5ShR1RfB7MoBPTpkRrBFYP1uT35g3MvT] #20500

Workflow file for this run

name: CI macOS
on:
push:
branches:
- master
paths-ignore:
# vlib/v3/** is intentionally NOT ignored: V3 is the default compiler on
# macOS, so changes to it must run this suite (with the fallback disabled).
- '**.md'
- '**.yml'
- '!**/macos_ci.yml'
- 'cmd/tools/**'
- '!cmd/tools/builders/**.v'
pull_request:
paths-ignore:
# vlib/v3/** is intentionally NOT ignored: V3 is the default compiler on
# macOS, so changes to it must run this suite (with the fallback disabled).
- '**.md'
- '**.yml'
- '!**/macos_ci.yml'
- 'cmd/tools/**'
- '!cmd/tools/builders/**.v'
concurrency:
group: macos-${{ github.workflow }}-${{ github.ref == 'refs/heads/master' && github.sha || github.ref }}
cancel-in-progress: true
jobs:
clang-macos:
strategy:
matrix:
# V3 (vlib/v3, `-new-compiler`) is the default compiler on macOS, so
# exercise it on every arm64 (Apple-silicon) runner image, not just one.
os: [macos-14, macos-15, macos-26]
fail-fast: false
runs-on: ${{ matrix.os }}
timeout-minutes: 151
env:
VFLAGS: -cc clang
VTEST_SHOW_LONGEST_BY_RUNTIME: 3
VTEST_SHOW_LONGEST_BY_COMPTIME: 3
VTEST_SHOW_LONGEST_BY_TOTALTIME: 3
# V3 is the default compiler on macOS; disable the V3->V1 fallback for every
# eligible V3 build so a regression fails CI directly. The `.vsh` runner is
# intentionally compiled by V1; the canary below verifies V3 dispatch itself.
V_MACOS_V3_NO_FALLBACK: 1
steps:
- uses: actions/checkout@v7.0.1
- name: Cache Homebrew downloads
uses: actions/cache@v6
with:
path: ~/Library/Caches/Homebrew
key: brew-${{ matrix.os }}-${{ hashFiles('.github/workflows/macos_ci.yml', 'ci/macos_ci.vsh') }}
restore-keys: |
brew-${{ matrix.os }}-
- name: Build V
# `make` runs bootstrap helpers before the V3 canary; `.vsh` helpers intentionally
# use V1, and other helpers may need the compatibility fallback. Clear the guard
# for this bootstrap step; later eligible builds and the canary retain it.
env:
V_MACOS_V3_NO_FALLBACK: 0
run: make -j4 && ./v symlink
- name: Assert V3 is the default compiler (fail if V1 is silently used)
run: |
set -uo pipefail
printf 'fn main() { println(6 * 7) }\n' > "$RUNNER_TEMP/v3_canary.v"
V_MACOS_V3_NO_FALLBACK=1 ./v -v run "$RUNNER_TEMP/v3_canary.v" > "$RUNNER_TEMP/v3_canary.out" 2>&1 || true
cat "$RUNNER_TEMP/v3_canary.out"
grep -q 'V3 compiler in process' "$RUNNER_TEMP/v3_canary.out" || { echo '::error::V3 was NOT dispatched on macOS — the program was compiled by V1'; exit 1; }
grep -qx '42' "$RUNNER_TEMP/v3_canary.out" || { echo '::error::the V3-compiled canary did not build/run correctly'; exit 1; }
if grep -qiE 'retrying with .-old-compiler|compatibility fallback|used the stable compiler' "$RUNNER_TEMP/v3_canary.out"; then echo '::error::V3 silently fell back to V1'; exit 1; fi
echo 'OK: V3 compiled and ran this program in-process on macOS, with the fallback disabled'
- name: Pkg-config regressions (Clang, no static executable)
run: |
set -euo pipefail
for test in \
vlib/v/pkgconfig/pkgconfig_static_test.v \
vlib/v/checker/pkgconfig_static_mode_test.v \
vlib/v/checker/pkgconfig_cross_compile_test.v \
vlib/v/builder/pkgconfig_link_segment_test.v
do
./v -cc clang -no-retry-compilation test "$test"
done
- name: Legacy gg import multiwindow isolation
run: ./v test vlib/gg/legacy_import_multiwindow_isolation_test.v
- name: Prepare multiwindow process-tree watchdog
run: |
set -euo pipefail
cat > "$RUNNER_TEMP/multiwindow_ci_watchdog.v" <<'EOF'
module main
import gg.testdata.multiwindow_probe_watchdog
import os
import time
fn main() {
run_ci_watchdog() or {
eprintln(err.msg())
exit(1)
}
}
fn run_ci_watchdog() ! {
if os.args.len < 4 {
return error('usage: multiwindow_ci_watchdog timeout-seconds expected-final-line executable [args...]')
}
timeout_seconds := os.args[1].int()
if timeout_seconds <= 0 {
return error('multiwindow CI watchdog timeout must be positive')
}
expected_final_line := os.args[2]
gate_path := os.join_path(os.temp_dir(), 'multiwindow_ci_gate_${os.getpid()}_${time.now().unix_nano()}')
defer {
os.rm(gate_path) or {}
}
result := multiwindow_probe_watchdog.run(
executable: os.args[3]
args: os.args[4..]
timeout: timeout_seconds * time.second
start_file: gate_path
)!
if result.stdout != '' {
print(result.stdout)
}
if result.stderr != '' {
eprint(result.stderr)
}
if result.timed_out {
return error('multiwindow CI child timed out after ${timeout_seconds} seconds')
}
if !result.reaped {
return error('multiwindow CI child leader was not reaped')
}
if !result.confinement_empty {
return error('multiwindow CI child process confinement is not empty')
}
if result.forced_cleanup {
return error('multiwindow CI child required forced cleanup')
}
if result.exit_code != 0 {
return error('multiwindow CI child exited with ${result.exit_code}')
}
if expected_final_line == '-' {
return
}
mut actual_final_line := ''
for line in result.stdout.split_into_lines() {
if line.trim_space() != '' {
actual_final_line = line.trim_space()
}
}
if actual_final_line != expected_final_line {
return error('multiwindow CI final record mismatch: expected `${expected_final_line}`, got `${actual_final_line}`')
}
}
EOF
./v -cc clang -o "$RUNNER_TEMP/multiwindow_ci_watchdog" "$RUNNER_TEMP/multiwindow_ci_watchdog.v"
- name: Multiwindow Metal regressions and runtime probes
# Some multiwindow tests still exercise V3-incompatible constructs. The
# direct canary above remains strict; this lane also verifies fallback.
env:
V_MACOS_V3_NO_FALLBACK: 0
VGG_MULTIWINDOW_RUNTIME_PROBES: '1'
VGG_MULTIWINDOW_RUNTIME_BACKEND: appkit
VGG_MULTIWINDOW_EXAMPLE_UNATTENDED: appkit
V_MULTIWINDOW_PROBE_BACKEND: appkit
run: |
set -euo pipefail
./v -cc clang -d gg_multiwindow -d sokol_metal \
-o /tmp/gg_multiwindow_metal examples/gg/multiwindow.v
./v -cc clang -d gg_multiwindow -d sokol_metal \
-o /tmp/gg_multiwindow_render_runtime_metal examples/gg/multiwindow_render_runtime.v
tests=(
vlib/x/multiwindow/event_sequence_exhaustion_test.v
vlib/x/multiwindow/event_terminal_delivery_test.v
vlib/x/multiwindow/internal_fault_matrix_test.v
vlib/x/multiwindow/multiwindow_test.v
vlib/x/multiwindow/native_operation_proof_test.v
vlib/x/multiwindow/render_scheduler_test.v
vlib/x/multiwindow/render_target_lease_test.v
vlib/x/multiwindow/teardown_contract_test.v
vlib/gg/multiwindow_api_d_gg_multiwindow_test.v
vlib/gg/multiwindow_buffer_cleanup_d_gg_multiwindow_test.v
vlib/gg/multiwindow_render_fault_matrix_d_gg_multiwindow_test.v
vlib/gg/multiwindow_render_runtime_contract_test.v
vlib/gg/frame_pacing_test.v
vlib/gg/draw_fns_api_test.v
vlib/gg/draw_rect_empty_test.v
)
for test in "${tests[@]}"; do
"$RUNNER_TEMP/multiwindow_ci_watchdog" 300 - \
./v -cc clang -d gg_multiwindow -d sokol_metal test "$test"
done
"$RUNNER_TEMP/multiwindow_ci_watchdog" 120 \
'{"example":"multiwindow_render_runtime","status":"PASS","cleanup":"complete"}' \
/tmp/gg_multiwindow_render_runtime_metal
"$RUNNER_TEMP/multiwindow_ci_watchdog" 120 \
'{"example":"multiwindow","status":"PASS","cleanup":"complete"}' \
/tmp/gg_multiwindow_metal
- name: Test AppKit GLCore rejection guard
run: ./v -d gg_multiwindow -d darwin_sokol_glcore33 test vlib/x/multiwindow/multiwindow_test.v
- name: Test symlink
run: v run ci/macos_ci.vsh test_symlink
- name: v doctor
run: v run ci/macos_ci.vsh v_doctor
- name: Build v with -prealloc
run: v run ci/macos_ci.vsh build_v_with_prealloc
- name: Test cross compilation to Linux
run: v run ci/macos_ci.vsh test_cross_compilation
- name: Test inline assembly on macos
run: v run ci/macos_ci.vsh test_inline_assembly
- name: Build V with -cstrict
run: v run ci/macos_ci.vsh build_with_cstrict
- name: All code is formatted
run: v run ci/macos_ci.vsh all_code_is_formatted
- name: Run sanitizers
run: v run ci/macos_ci.vsh run_sanitizers
- name: Build V using V
run: v run ci/macos_ci.vsh build_using_v
- name: Verify `v test` works
run: v run ci/macos_ci.vsh verify_v_test_works
- name: Install iconv for encoding.iconv
run: v run ci/macos_ci.vsh install_iconv
- name: Test pure V math module
run: v run ci/macos_ci.vsh test_pure_v_math_module
- name: Self tests
run: v run ci/macos_ci.vsh self_tests
- name: Build examples
run: v run ci/macos_ci.vsh build_examples
- name: Build tetris with -autofree
run: v run ci/macos_ci.vsh build_tetris_autofree
- name: Build blog tutorial with -autofree
run: v run ci/macos_ci.vsh build_blog_autofree
- name: Build examples with -prod
run: v run ci/macos_ci.vsh build_examples_prod
- name: Build examples with V build with tcc
run: v run ci/macos_ci.vsh build_examples_v_compiled_with_tcc
## - name: V self compilation with -usecache
## run: v run ci/macos_ci.vsh v_self_compilation_usecache
- name: V self compilation with -parallel-cc
run: v run ci/macos_ci.vsh v_self_compilation_parallel_cc
- name: Test password input
run: v run ci/macos_ci.vsh test_password_input
- name: Test readline
run: v run ci/macos_ci.vsh test_readline