| ... | @@ -7819,6 +7819,7 @@ fn zirArrayType(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!A | ... | @@ -7819,6 +7819,7 @@ fn zirArrayType(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!A |
| 7819 | const elem_src: LazySrcLoc = .{ .node_offset_array_type_elem = inst_data.src_node }; | 7819 | const elem_src: LazySrcLoc = .{ .node_offset_array_type_elem = inst_data.src_node }; |
| 7820 | const len = try sema.resolveInt(block, len_src, extra.lhs, Type.usize, "array length must be comptime-known"); | 7820 | const len = try sema.resolveInt(block, len_src, extra.lhs, Type.usize, "array length must be comptime-known"); |
| 7821 | const elem_type = try sema.resolveType(block, elem_src, extra.rhs); | 7821 | const elem_type = try sema.resolveType(block, elem_src, extra.rhs); |
| | 7822 | try sema.validateArrayElemType(block, elem_type, elem_src); |
| 7822 | const array_ty = try Type.array(sema.arena, len, null, elem_type, sema.mod); | 7823 | const array_ty = try Type.array(sema.arena, len, null, elem_type, sema.mod); |
| 7823 | | 7824 | |
| 7824 | return sema.addType(array_ty); | 7825 | return sema.addType(array_ty); |
| ... | @@ -7835,6 +7836,7 @@ fn zirArrayTypeSentinel(sema: *Sema, block: *Block, inst: Zir.Inst.Index) Compil | ... | @@ -7835,6 +7836,7 @@ fn zirArrayTypeSentinel(sema: *Sema, block: *Block, inst: Zir.Inst.Index) Compil |
| 7835 | const elem_src: LazySrcLoc = .{ .node_offset_array_type_elem = inst_data.src_node }; | 7836 | const elem_src: LazySrcLoc = .{ .node_offset_array_type_elem = inst_data.src_node }; |
| 7836 | const len = try sema.resolveInt(block, len_src, extra.len, Type.usize, "array length must be comptime-known"); | 7837 | const len = try sema.resolveInt(block, len_src, extra.len, Type.usize, "array length must be comptime-known"); |
| 7837 | const elem_type = try sema.resolveType(block, elem_src, extra.elem_type); | 7838 | const elem_type = try sema.resolveType(block, elem_src, extra.elem_type); |
| | 7839 | try sema.validateArrayElemType(block, elem_type, elem_src); |
| 7838 | const uncasted_sentinel = try sema.resolveInst(extra.sentinel); | 7840 | const uncasted_sentinel = try sema.resolveInst(extra.sentinel); |
| 7839 | const sentinel = try sema.coerce(block, elem_type, uncasted_sentinel, sentinel_src); | 7841 | const sentinel = try sema.coerce(block, elem_type, uncasted_sentinel, sentinel_src); |
| 7840 | const sentinel_val = try sema.resolveConstValue(block, sentinel_src, sentinel, "array sentinel value must be comptime-known"); | 7842 | const sentinel_val = try sema.resolveConstValue(block, sentinel_src, sentinel, "array sentinel value must be comptime-known"); |
| ... | @@ -7843,6 +7845,14 @@ fn zirArrayTypeSentinel(sema: *Sema, block: *Block, inst: Zir.Inst.Index) Compil | ... | @@ -7843,6 +7845,14 @@ fn zirArrayTypeSentinel(sema: *Sema, block: *Block, inst: Zir.Inst.Index) Compil |
| 7843 | return sema.addType(array_ty); | 7845 | return sema.addType(array_ty); |
| 7844 | } | 7846 | } |
| 7845 | | 7847 | |
| | 7848 | fn validateArrayElemType(sema: *Sema, block: *Block, elem_type: Type, elem_src: LazySrcLoc) !void { |
| | 7849 | if (elem_type.zigTypeTag() == .Opaque) { |
| | 7850 | return sema.fail(block, elem_src, "array of opaque type '{}' not allowed", .{elem_type.fmt(sema.mod)}); |
| | 7851 | } else if (elem_type.zigTypeTag() == .NoReturn) { |
| | 7852 | return sema.fail(block, elem_src, "array of 'noreturn' not allowed", .{}); |
| | 7853 | } |
| | 7854 | } |
| | 7855 | |
| 7846 | fn zirAnyframeType(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Inst.Ref { | 7856 | fn zirAnyframeType(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Inst.Ref { |
| 7847 | const tracy = trace(@src()); | 7857 | const tracy = trace(@src()); |
| 7848 | defer tracy.end(); | 7858 | defer tracy.end(); |