diff options
| author | Veikka Tuominen <git@vexu.eu> | 2022-11-04 18:38:42 +0200 |
|---|---|---|
| committer | Veikka Tuominen <git@vexu.eu> | 2022-11-04 23:13:50 +0200 |
| commit | 51b1083d66b29d110c8cf60b59052170dd34a95f (patch) | |
| tree | 4d2d18a6358c4a3ce3a2957d101dbc793b3d37d3 /src/Sema.zig | |
| parent | 42db468dcb3de15426f9f8ec8da78e36155e3510 (diff) | |
| download | zig-51b1083d66b29d110c8cf60b59052170dd34a95f.tar.gz zig-51b1083d66b29d110c8cf60b59052170dd34a95f.zip | |
stage2: fix onePossibleValue of empty unions and enums
Closes #13402
Diffstat (limited to 'src/Sema.zig')
| -rw-r--r-- | src/Sema.zig | 23 |
1 files changed, 13 insertions, 10 deletions
diff --git a/src/Sema.zig b/src/Sema.zig index 849b0053ac..d7fce06e7f 100644 --- a/src/Sema.zig +++ b/src/Sema.zig @@ -10343,6 +10343,9 @@ fn zirSwitchBlock(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError } if (err_set) try sema.maybeErrorUnwrapComptime(&child_block, special.body, operand); if (special.is_inline) child_block.inline_case_capture = operand; + if (empty_enum) { + return Air.Inst.Ref.void_value; + } return sema.resolveBlockBody(block, src, &child_block, special.body, inst, merges); } @@ -30479,23 +30482,23 @@ pub fn typeHasOnePossibleValue( if (enum_obj.tag_ty.hasRuntimeBits()) { return null; } - if (enum_obj.fields.count() == 1) { - if (enum_obj.values.count() == 0) { + switch (enum_obj.fields.count()) { + 0 => return Value.initTag(.unreachable_value), + 1 => if (enum_obj.values.count() == 0) { return Value.zero; // auto-numbered } else { return enum_obj.values.keys()[0]; - } - } else { - return null; + }, + else => return null, } }, .enum_simple => { const resolved_ty = try sema.resolveTypeFields(block, src, ty); const enum_simple = resolved_ty.castTag(.enum_simple).?.data; - if (enum_simple.fields.count() == 1) { - return Value.zero; - } else { - return null; + switch (enum_simple.fields.count()) { + 0 => return Value.initTag(.unreachable_value), + 1 => return Value.zero, + else => return null, } }, .enum_nonexhaustive => { @@ -30512,7 +30515,7 @@ pub fn typeHasOnePossibleValue( const tag_val = (try sema.typeHasOnePossibleValue(block, src, union_obj.tag_ty)) orelse return null; const fields = union_obj.fields.values(); - if (fields.len == 0) return Value.initTag(.empty_struct_value); + if (fields.len == 0) return Value.initTag(.unreachable_value); const only_field = fields[0]; if (only_field.ty.eql(resolved_ty, sema.mod)) { const msg = try Module.ErrorMsg.create( |
