diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/Sema.zig | 29 | ||||
| -rw-r--r-- | src/type.zig | 3 |
2 files changed, 19 insertions, 13 deletions
diff --git a/src/Sema.zig b/src/Sema.zig index 4485475eaf..d0c4bbec75 100644 --- a/src/Sema.zig +++ b/src/Sema.zig @@ -10186,7 +10186,7 @@ fn validateVarType( is_extern: bool, ) CompileError!void { var ty = var_ty; - const ok: bool = while (true) switch (ty.zigTypeTag()) { + while (true) switch (ty.zigTypeTag()) { .Bool, .Int, .Float, @@ -10194,7 +10194,7 @@ fn validateVarType( .Enum, .Frame, .AnyFrame, - => break true, + => return, .BoundFn, .ComptimeFloat, @@ -10205,14 +10205,14 @@ fn validateVarType( .Void, .Undefined, .Null, - => break false, + => break, .Pointer => { const elem_ty = ty.childType(); if (elem_ty.zigTypeTag() == .Opaque) return; ty = elem_ty; }, - .Opaque => break is_extern, + .Opaque => if (is_extern) return else break, .Optional => { var buf: Type.Payload.ElemType = undefined; @@ -10223,15 +10223,17 @@ fn validateVarType( .ErrorUnion => ty = ty.errorUnionPayload(), - .Fn => @panic("TODO fn validateVarType"), - .Struct, .Union => { + .Fn, .Struct, .Union => { const resolved_ty = try sema.resolveTypeFields(block, src, ty); - break !resolved_ty.requiresComptime(); + if (resolved_ty.requiresComptime()) { + break; + } else { + return; + } }, } else unreachable; // TODO should not need else unreachable - if (!ok) { - return sema.fail(block, src, "variable of type '{}' must be const or comptime", .{var_ty}); - } + + return sema.fail(block, src, "variable of type '{}' must be const or comptime", .{var_ty}); } pub const PanicId = enum { @@ -11273,7 +11275,12 @@ fn coerce( const in_memory_result = coerceInMemoryAllowed(dest_type, inst_ty, false, target); if (in_memory_result == .ok) { - return sema.bitCast(block, dest_type, inst, inst_src); + if (try sema.resolveMaybeUndefVal(block, inst_src, inst)) |val| { + // Keep the comptime Value representation; take the new type. + return sema.addConstant(dest_type, val); + } + try sema.requireRuntimeBlock(block, inst_src); + return block.addTyOp(.bitcast, dest_type, inst); } // undefined to anything diff --git a/src/type.zig b/src/type.zig index 72430c9f65..055b32a048 100644 --- a/src/type.zig +++ b/src/type.zig @@ -1458,7 +1458,7 @@ pub const Type = extern union { } }, .union_tagged => { - const union_obj = self.castTag(.@"union").?.data; + const union_obj = self.castTag(.union_tagged).?.data; if (union_obj.tag_ty.hasCodeGenBits()) { return true; } @@ -1470,7 +1470,6 @@ pub const Type = extern union { } }, - // TODO lazy types .array, .vector => self.elemType().hasCodeGenBits() and self.arrayLen() != 0, .array_u8 => self.arrayLen() != 0, |
