Commit 2f07d76eee

Andrew Kelley <andrew@ziglang.org>
2021-04-03 06:17:23
stage2: implement Type.onePossibleValue for structs
1 parent d47f0ab
Changed files (2)
src
test
stage2
src/type.zig
@@ -3118,8 +3118,14 @@ pub const Type = extern union {
             => return null,
 
             .@"struct" => {
-                log.warn("TODO implement Type.onePossibleValue for structs", .{});
-                return null;
+                const s = ty.castTag(.@"struct").?.data;
+                for (s.fields.entries.items) |entry| {
+                    const field_ty = entry.value.ty;
+                    if (field_ty.onePossibleValue() == null) {
+                        return null;
+                    }
+                }
+                return Value.initTag(.empty_struct_value);
             },
 
             .empty_struct, .empty_struct_literal => return Value.initTag(.empty_struct_value),
test/stage2/cbe.zig
@@ -524,6 +524,16 @@ pub fn addCases(ctx: *TestContext) !void {
             ":6:10: error: no field named 'z' in struct 'Point'",
             ":1:15: note: 'Point' declared here",
         });
+        case.addCompareOutput(
+            \\const Point = struct { x: i32, y: i32 };
+            \\export fn main() c_int {
+            \\    var p: Point = .{
+            \\        .x = 12,
+            \\        .y = 24,
+            \\    };
+            \\    return p.y - p.x - p.x;
+            \\}
+        , "");
     }
 
     ctx.c("empty start function", linux_x64,