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