-
-
Notifications
You must be signed in to change notification settings - Fork 2.8k
Inline loop over functions where one returns empty error set gives compiler error #1957
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Comments
Flipping the order of |
I'll add another test case for this one. Looks like there are a few different open bugs for this error, but this issue seems to be the most similar. Running zig test on the below code I get: I found that removing the bool type in Vec3 so all code paths for the inline-for loop will have the same error type will let it compile. Also specifying the error set manually will workaround the issue as well. const std = @import("std");
const ArrayList = std.ArrayList;
const Allocator = std.mem.Allocator;
// Workaround #1: Change return type to specific error set
//pub fn serialize(value: var, output: *ArrayList(u8)) error{OutOfMemory}!void {
pub fn serialize(value: var, output: *ArrayList(u8)) !void {
switch (@typeInfo(@TypeOf(value))) {
.Int, .Float, => {
try output.appendSlice(std.mem.asBytes(&value).*[0..]);
},
.Struct => {
const T = @TypeOf(value);
inline for (@typeInfo(T).Struct.fields) |fieldType| {
// Workaround #2: instead of 'try' handle error
// serialize(@field(value, fieldType.name), output) catch unreachable;
try serialize(@field(value, fieldType.name), output);
}
},
.Bool => { },
else => @compileError("Unable to serialize type'" ++ @typeName(@TypeOf(value)) ++ "'"),
}
}
test "Test" {
const alloactor = std.testing.allocator;
const Vec2 = struct {
x: i32,
y: i32,
};
const Vec3 = struct {
// Workaround #3: remove bool type (comment out line)
some_bool: bool = false,
x: i32,
y: i32,
z: i32,
};
const vec2 = Vec2{.x=1, .y=2};
const vec3 = Vec3{.x=1, .y=2,.z=3};
var buffer1 = ArrayList(u8).init(alloactor);
defer buffer1.deinit();
var buffer2 = ArrayList(u8).init(alloactor);
defer buffer2.deinit();
try serialize(vec2, &buffer1);
try serialize(vec3, &buffer2);
std.testing.expectEqualSlices(u8, buffer1.items, buffer2.items[0..8]);
} |
Closes ziglang#1957 Closes ziglang#1994 Closes ziglang#2140 Closes ziglang#2746 Closes ziglang#2802 Closes ziglang#2855 Closes ziglang#2895 Closes ziglang#2981 Closes ziglang#3054 Closes ziglang#3158 Closes ziglang#3234 Closes ziglang#3259 Closes ziglang#3371 Closes ziglang#3376 Closes ziglang#3387 Closes ziglang#3529 Closes ziglang#3653 Closes ziglang#3750 Closes ziglang#3778 Closes ziglang#3882 Closes ziglang#3915 Closes ziglang#3929 Closes ziglang#3961 Closes ziglang#3988 Closes ziglang#4123 Closes ziglang#7448
Closes ziglang#1957 Closes ziglang#1994 Closes ziglang#2140 Closes ziglang#2746 Closes ziglang#2802 Closes ziglang#2855 Closes ziglang#2895 Closes ziglang#2981 Closes ziglang#3054 Closes ziglang#3158 Closes ziglang#3234 Closes ziglang#3259 Closes ziglang#3371 Closes ziglang#3376 Closes ziglang#3387 Closes ziglang#3529 Closes ziglang#3653 Closes ziglang#3750 Closes ziglang#3778 Closes ziglang#3882 Closes ziglang#3915 Closes ziglang#3929 Closes ziglang#3961 Closes ziglang#3988 Closes ziglang#4123 Closes ziglang#7448
Closes ziglang#1957 Closes ziglang#1994 Closes ziglang#2140 Closes ziglang#2746 Closes ziglang#2802 Closes ziglang#2855 Closes ziglang#2895 Closes ziglang#2981 Closes ziglang#3054 Closes ziglang#3158 Closes ziglang#3234 Closes ziglang#3259 Closes ziglang#3371 Closes ziglang#3376 Closes ziglang#3387 Closes ziglang#3529 Closes ziglang#3653 Closes ziglang#3750 Closes ziglang#3778 Closes ziglang#3882 Closes ziglang#3915 Closes ziglang#3929 Closes ziglang#3961 Closes ziglang#3988 Closes ziglang#4123 Closes ziglang#7448
Closes ziglang#1957 Closes ziglang#1994 Closes ziglang#2140 Closes ziglang#2746 Closes ziglang#2802 Closes ziglang#2855 Closes ziglang#2895 Closes ziglang#2981 Closes ziglang#3054 Closes ziglang#3158 Closes ziglang#3234 Closes ziglang#3259 Closes ziglang#3371 Closes ziglang#3376 Closes ziglang#3387 Closes ziglang#3529 Closes ziglang#3653 Closes ziglang#3750 Closes ziglang#3778 Closes ziglang#3882 Closes ziglang#3915 Closes ziglang#3929 Closes ziglang#3961 Closes ziglang#3988 Closes ziglang#4123 Closes ziglang#7448
Closes ziglang#1957 Closes ziglang#1994 Closes ziglang#2140 Closes ziglang#2746 Closes ziglang#2802 Closes ziglang#2855 Closes ziglang#2895 Closes ziglang#2981 Closes ziglang#3054 Closes ziglang#3158 Closes ziglang#3234 Closes ziglang#3259 Closes ziglang#3371 Closes ziglang#3376 Closes ziglang#3387 Closes ziglang#3529 Closes ziglang#3653 Closes ziglang#3750 Closes ziglang#3778 Closes ziglang#3882 Closes ziglang#3915 Closes ziglang#3929 Closes ziglang#3961 Closes ziglang#3988 Closes ziglang#4123 Closes ziglang#7448
I would expect this to work, but it doesn't.
The text was updated successfully, but these errors were encountered: