Migrate to new Zig compiler#413
Merged
Merged
Conversation
Removed Path.type! function which was causing crash: "increfDataPtrC: ORIGINAL ptr=0x1 is not 8-byte aligned". This appears to be an ABI issue with opaque types in RocTry with the new compiler. The function used an opaque type PathType := [IsDir, IsFile, IsSymLink] which doesn't work correctly in Try results. The three individual functions (is_file!, is_dir!, is_sym_link!) all work perfectly and cover the same use cases. All tests now pass. Path.type! can be investigated as a separate follow-up issue once the opaque type ABI is better understood. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
- Restructure Cmd to use opaque type with methods (Cmd := { record }.{ methods })
- Update doc comments to use -> operator syntax instead of deprecated |>
- Delete orphaned examples (dir-test, env-test, file-test, print-test)
- Delete orphaned expect scripts for removed examples
- Delete old tests/ directory with unmigrated tests
- Update all_tests.sh to remove references to deleted examples
- Add test files demonstrating -> operator syntax works
Note: Static dispatch with . syntax crashes compiler (checkDeferredStaticDispatchConstraints)
so we use -> operator syntax instead, which works correctly.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
After compiler fixes for static dispatch, we can now use the idiomatic
. syntax for all methods including effects:
- Update all doc comments to show static dispatch syntax
- Effect methods now work: cmd.exec_exit_code!()
- Builder methods continue to work: Cmd.new("ls").args([])
- Full fluent API: Cmd.new("echo").args(["Hi"]).exec_cmd!()
Previous syntax required:
- . for regular methods
- Qualified calls for effects (Cmd.exec_exit_code!(cmd))
Now all methods use consistent . syntax throughout.
Tests verify:
- Simple method chaining with effects
- Multiline builder patterns
- Output capture via static dispatch
- Complete fluent chains
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Use argc/argv directly instead of std::env::args() because when built as a static library, the Rust runtime isn't properly initialized and std::env::args() returns an empty list. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
c_char is u8 on ARM64 Linux but i8 on x86, so use the portable c_char type from std::ffi for argv handling. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
The `git diff | head -50` command can exit with 141 (SIGPIPE) on Linux when head closes the pipe before git finishes writing. Add `|| true` to ignore this expected condition. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Limit GITHUB_TOKEN permissions to contents:read by default, as recommended by GitHub's security scanner. The create-release job overrides this with contents:write as needed. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
lukewilliamboswell
marked this pull request as ready for review
July 13, 2026 05:39
- Normalize Windows filesystem errors (ACCESS_DENIED on directories) to the portable IsADirectory/NotADirectory IOErr tags; fixes the error-handling example on Windows - Work around the u128 return ABI mismatch on x86_64-windows by reshaping Host.utc_now! to Try(U128, [ClockBeforeEpoch]); fixes the time example crash (upstream: roc-lang/roc#10163) - Implement File.is_readable!/is_writable!/is_executable! on Windows and re-enable the file-permissions example there - Un-skip time.roc run scenario on Windows - Add a validate-windows CI job (fmt/check/test on windows-2025) - Gate the CStr import behind cfg(unix) to fix the Windows build warning Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
basic-clito the new Zig compiler and flat platform host ABI.roc_hoststatic library and restore the public CLI platform surface for commands, files and directories, environment access, HTTP, SQLite, TCP, terminal I/O, time, and related utilities.roc-lang/release-package.Public API and migration notes
This is a breaking platform release, not only a compiler implementation change.
OsStrvalues, preserving Unix bytes and Windows UTF-16. The oldArgmodule is replaced byOsStr.roc-lang/pathpackage types, and HTTP requests/responses use the sharedroc-lang/httppackage types.Try/open-tag error style and expose structuredIOErrvalues.dict!,platform!, working-directory access/update, executable path, and temporary directory.Automated validation
The last complete GitHub matrix is green, including:
x64mac,arm64mac,x64musl,arm64musl, andx64win;.tar.zstplatform bundle and consuming the downloaded bundle on those four native runners;Runs: CI · release dry run
On the latest head, local validation with Roc
debug-a06fe3fcpasses formatting and checking for every example, all 66 Roc tests,git diff --check, Rust formatting and a locked all-target Cargo test-profile build, ShellCheck/Bash syntax, Python syntax, and test-spec JSON parsing.The fresh GitHub run currently stops at
roc fmt --checkbecause the publishedrelease-fast-252a59aenightly predates the formatter used for the final cleanup. It reaches the first changed SQLite example without a compile or test failure. Rerun the matrix afterdebug-a06fe3fc(or its formatter change) is published in the next nightly.CI and release intentionally follow the current
nightly-new-compileralias. Zig is pinned to 0.16.0 and Rust to 1.82.0.Release flow
The Release workflow is available through
workflow_dispatchwith a stable or release-candidate version. It:The shared release actions are pinned to
d2560ead9f724bfaabfbc8134b8895e120171064.bump_checkis temporarilywarn: stable0.20.0uses the old.tar.brformat and Roc syntax, whilealpha-0no longer parses with the current compiler. Change this torequireafter the first stable new-compiler.tar.zstrelease.Known limitations and coverage notes
examples/time.rocbuilds on Windows but its runtime case is skipped. This is accepted for the release candidate.Unsupportedresult.Final review
The branch is based on the current
mainand is mergeable. This PR remains a draft while the final maintainer review is completed; it can be marked ready once that review and the fresh GitHub matrix are satisfactory.