-
-
Notifications
You must be signed in to change notification settings - Fork 3.1k
Closed
Labels
bugObserved behavior contradicts documented or intended behaviorObserved behavior contradicts documented or intended behaviorstage1The process of building from source via WebAssembly and the C backend.The process of building from source via WebAssembly and the C backend.
Milestone
Description
When compiling the following code, the compiler will run into an endless loop trying to analyze whatever it is to analyze:
const std = @import("std");
const Value = union(enum) {
array: Array,
item: i32,
/// Checks if two values are equal.
pub fn format(value: @This(), comptime fmt: []const u8, options: std.fmt.FormatOptions, context: var, comptime Errors: type, comptime output: fn (@TypeOf(context), []const u8) Errors!void) Errors!void {
return switch (value) {
.item => |i| std.fmt.format(context, Errors, output, "{d}", .{i}),
.array => |array| {
for (array) |item| {
try std.fmt.format(context, Errors, output, " {}", .{item}); // <= @0 will analyze forever
// try format(item, fmt, options, context, Errors, output); // <= @1 works
}
// try arrayFormat(array, context, Errors, output); // @2 works as well
},
};
}
fn arrayFormat(array: Array, context: var, comptime Errors: type, comptime output: fn (@TypeOf(context), []const u8) Errors!void) Errors!void {
for (array) |item| {
try std.fmt.format(context, Errors, output, " {}", .{item}); // <= @2 works as well
}
}
};
const Array = []const Value;
test "will analyze forever" {
const v: Value = Value{ .item = 1 };
std.debug.warn("{}\n", .{v}); // this will call `format` on our struct
}This code will run into an endless loop of semantic analysis when using variant @0:
[felix@denkplatte-v2 bugreports]$ zig test recursion-error.zig
Semantic Analysis [3552/5909] ^C
It will run when using variant @1 (using direct recursion) or variant @2 (calling a function that will call the formatter)
Zig version: 0.5.0+330e30aec
codehz
Metadata
Metadata
Assignees
Labels
bugObserved behavior contradicts documented or intended behaviorObserved behavior contradicts documented or intended behaviorstage1The process of building from source via WebAssembly and the C backend.The process of building from source via WebAssembly and the C backend.