After writing my previous article, I found that someone had already fixed the Zig compiler using this simple trick that the Zig zealots hate, but it isn’t updated to the latest version. That’s okay though, because the changes are small enough that we could set it up ourselves.
Install some prerequisites to be able to build the Zig compiler, here using Ubuntu Jammy:
apt install lsb-release wget software-properties-common gnupg
bash -c "$(wget -O - https://apt.llvm.org/llvm.sh)"
apt install cmake clang clang-tools libclang-17-dev liblld-17 liblld-17-dev
Clone Zig, and edit the relevant source file
git clone https://github.com/ziglang/zig.git
cd zig
vim src/AstGen.zig +2929
You want to go to the definition of the checkUsed
function, which is currently on line 2929:
fn checkUsed(gz: *GenZir, outer_scope: *Scope, inner_scope: *Scope) InnerError!void {
const astgen = gz.astgen;
var scope = inner_scope;
while (scope != outer_scope) {
To make the least amount of changes, dummy the whole thing out.
fn checkUsed(gz: *GenZir, outer_scope: *Scope, inner_scope: *Scope) InnerError!void {
if (true) {
return;
}
const astgen = gz.astgen;
var scope = inner_scope;
while (scope != outer_scope) {
That’s all you need. On to compiling:
mkdir build
cd build
cmake ..
make install
The binary will end up as build/stage3/bin/zig
, so you may symlink this as zig-sloppy
or whatever you want.
Try to run the following file which would make the standard compiler explode:
const std = @import("std");
pub fn main() !void {
const unused = 42;
std.debug.print("Unused variable above!\n", .{});
do_stuff(39);
}
fn do_stuff(asdf: i32) void {
std.debug.print("We don't use that parameter here!\n!", .{});
}
Congratulations, you have now implemented your own --sloppy
mode for Zig. From following this short article you have been able to accomplish what the Zig devs have been unable to for years.