| ... | ... | @@ -8980,36 +8980,41 @@ fn zirDeclLiteral(sema: *Sema, block: *Block, inst: Zir.Inst.Index, do_coerce: b |
| 8980 | 8980 | sema.code.nullTerminatedString(extra.field_name_start), |
| 8981 | 8981 | .no_embedded_nulls, |
| 8982 | 8982 | ); |
| 8983 | |
| 8983 | 8984 | const orig_ty = sema.resolveType(block, src, extra.lhs) catch |err| switch (err) { |
| 8984 | | error.GenericPoison => { |
| 8985 | | // Treat this as a normal enum literal. |
| 8986 | | return Air.internedToRef(try pt.intern(.{ .enum_literal = name })); |
| 8987 | | }, |
| 8985 | error.GenericPoison => Type.generic_poison, |
| 8988 | 8986 | else => |e| return e, |
| 8989 | 8987 | }; |
| 8990 | 8988 | |
| 8991 | | var ty = orig_ty; |
| 8992 | | while (true) switch (ty.zigTypeTag(zcu)) { |
| 8993 | | .error_union => ty = ty.errorUnionPayload(zcu), |
| 8994 | | .optional => ty = ty.optionalChild(zcu), |
| 8995 | | .enum_literal, .error_set => { |
| 8989 | const uncoerced_result = res: { |
| 8990 | if (orig_ty.toIntern() == .generic_poison_type) { |
| 8996 | 8991 | // Treat this as a normal enum literal. |
| 8997 | | return Air.internedToRef(try pt.intern(.{ .enum_literal = name })); |
| 8998 | | }, |
| 8999 | | else => break, |
| 9000 | | }; |
| 8992 | break :res Air.internedToRef(try pt.intern(.{ .enum_literal = name })); |
| 8993 | } |
| 8994 | |
| 8995 | var ty = orig_ty; |
| 8996 | while (true) switch (ty.zigTypeTag(zcu)) { |
| 8997 | .error_union => ty = ty.errorUnionPayload(zcu), |
| 8998 | .optional => ty = ty.optionalChild(zcu), |
| 8999 | .enum_literal, .error_set => { |
| 9000 | // Treat this as a normal enum literal. |
| 9001 | break :res Air.internedToRef(try pt.intern(.{ .enum_literal = name })); |
| 9002 | }, |
| 9003 | else => break, |
| 9004 | }; |
| 9001 | 9005 | |
| 9002 | | const result = try sema.fieldVal(block, src, Air.internedToRef(ty.toIntern()), name, src); |
| 9006 | break :res try sema.fieldVal(block, src, Air.internedToRef(ty.toIntern()), name, src); |
| 9007 | }; |
| 9003 | 9008 | |
| 9004 | 9009 | // Decl literals cannot lookup runtime `var`s. |
| 9005 | | if (!try sema.isComptimeKnown(result)) { |
| 9010 | if (!try sema.isComptimeKnown(uncoerced_result)) { |
| 9006 | 9011 | return sema.fail(block, src, "decl literal must be comptime-known", .{}); |
| 9007 | 9012 | } |
| 9008 | 9013 | |
| 9009 | 9014 | if (do_coerce) { |
| 9010 | | return sema.coerce(block, orig_ty, result, src); |
| 9015 | return sema.coerce(block, orig_ty, uncoerced_result, src); |
| 9011 | 9016 | } else { |
| 9012 | | return result; |
| 9017 | return uncoerced_result; |
| 9013 | 9018 | } |
| 9014 | 9019 | } |
| 9015 | 9020 | |