From d127c1d59ebf19e5ffaedece99a39f69712683b0 Mon Sep 17 00:00:00 2001 From: Daniele Cocca Date: Sat, 30 Apr 2022 07:34:21 +0100 Subject: [PATCH] CBE: handle returning `undefined` for ErrorUnion Just like for Struct in 8238d4b33585a715c58ab559cd001dd3ea1db55b, in the case of ErrorUnion struct we need to return a compound literal "(T){...}" instead of just "{}", which is invalid code when used in e.g. a "return" expression. --- src/codegen/c.zig | 2 +- test/behavior/sizeof_and_typeof.zig | 2 -- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/src/codegen/c.zig b/src/codegen/c.zig index 8f73daca46..2cd93d47fc 100644 --- a/src/codegen/c.zig +++ b/src/codegen/c.zig @@ -580,7 +580,7 @@ pub const DeclGen = struct { 64 => return writer.writeAll("(void *)0xaaaaaaaaaaaaaaaa"), else => unreachable, }, - .Struct => { + .Struct, .ErrorUnion => { try writer.writeByte('('); try dg.renderTypecast(writer, ty); return writer.writeAll("){0xaa}"); diff --git a/test/behavior/sizeof_and_typeof.zig b/test/behavior/sizeof_and_typeof.zig index 5db56243af..3dd786d1f7 100644 --- a/test/behavior/sizeof_and_typeof.zig +++ b/test/behavior/sizeof_and_typeof.zig @@ -187,7 +187,6 @@ test "@sizeOf(T) == 0 doesn't force resolving struct size" { test "@TypeOf() has no runtime side effects" { if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; - if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; const S = struct { fn foo(comptime T: type, ptr: *T) T { ptr.* += 1; @@ -203,7 +202,6 @@ test "@TypeOf() has no runtime side effects" { test "branching logic inside @TypeOf" { if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; - if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; const S = struct { var data: i32 = 0; fn foo() anyerror!i32 {