| ... | @@ -7309,9 +7309,11 @@ fn zirElemVal(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air | ... | @@ -7309,9 +7309,11 @@ fn zirElemVal(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air |
| 7309 | defer tracy.end(); | 7309 | defer tracy.end(); |
| 7310 | | 7310 | |
| 7311 | const bin_inst = sema.code.instructions.items(.data)[inst].bin; | 7311 | const bin_inst = sema.code.instructions.items(.data)[inst].bin; |
| | 7312 | const src = sema.src; // TODO better source location |
| | 7313 | const elem_index_src = sema.src; // TODO better source location |
| 7312 | const array = try sema.resolveInst(bin_inst.lhs); | 7314 | const array = try sema.resolveInst(bin_inst.lhs); |
| 7313 | const elem_index = try sema.resolveInst(bin_inst.rhs); | 7315 | const elem_index = try sema.resolveInst(bin_inst.rhs); |
| 7314 | return sema.elemVal(block, sema.src, array, elem_index, sema.src); | 7316 | return sema.elemVal(block, src, array, elem_index, elem_index_src); |
| 7315 | } | 7317 | } |
| 7316 | | 7318 | |
| 7317 | fn zirElemValNode(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Inst.Ref { | 7319 | fn zirElemValNode(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Inst.Ref { |
| ... | @@ -18473,6 +18475,25 @@ fn elemValArray( | ... | @@ -18473,6 +18475,25 @@ fn elemValArray( |
| 18473 | } | 18475 | } |
| 18474 | } | 18476 | } |
| 18475 | | 18477 | |
| | 18478 | const valid_rt = try sema.validateRunTimeType(block, elem_index_src, elem_ty, false); |
| | 18479 | if (!valid_rt) { |
| | 18480 | const msg = msg: { |
| | 18481 | const msg = try sema.errMsg( |
| | 18482 | block, |
| | 18483 | elem_index_src, |
| | 18484 | "values of type '{}' must be comptime known, but index value is runtime known", |
| | 18485 | .{array_ty.fmt(sema.mod)}, |
| | 18486 | ); |
| | 18487 | errdefer msg.destroy(sema.gpa); |
| | 18488 | |
| | 18489 | const src_decl = sema.mod.declPtr(block.src_decl); |
| | 18490 | try sema.explainWhyTypeIsComptime(block, elem_index_src, msg, array_src.toSrcLoc(src_decl), array_ty); |
| | 18491 | |
| | 18492 | break :msg msg; |
| | 18493 | }; |
| | 18494 | return sema.failWithOwnedErrorMsg(block, msg); |
| | 18495 | } |
| | 18496 | |
| 18476 | const runtime_src = if (maybe_undef_array_val != null) elem_index_src else array_src; | 18497 | const runtime_src = if (maybe_undef_array_val != null) elem_index_src else array_src; |
| 18477 | try sema.requireRuntimeBlock(block, runtime_src); | 18498 | try sema.requireRuntimeBlock(block, runtime_src); |
| 18478 | if (block.wantSafety()) { | 18499 | if (block.wantSafety()) { |
| ... | @@ -18528,6 +18549,25 @@ fn elemPtrArray( | ... | @@ -18528,6 +18549,25 @@ fn elemPtrArray( |
| 18528 | } | 18549 | } |
| 18529 | } | 18550 | } |
| 18530 | | 18551 | |
| | 18552 | const valid_rt = try sema.validateRunTimeType(block, elem_index_src, array_ty.elemType2(), false); |
| | 18553 | if (!valid_rt) { |
| | 18554 | const msg = msg: { |
| | 18555 | const msg = try sema.errMsg( |
| | 18556 | block, |
| | 18557 | elem_index_src, |
| | 18558 | "values of type '{}' must be comptime known, but index value is runtime known", |
| | 18559 | .{array_ty.fmt(sema.mod)}, |
| | 18560 | ); |
| | 18561 | errdefer msg.destroy(sema.gpa); |
| | 18562 | |
| | 18563 | const src_decl = sema.mod.declPtr(block.src_decl); |
| | 18564 | try sema.explainWhyTypeIsComptime(block, elem_index_src, msg, array_ptr_src.toSrcLoc(src_decl), array_ty); |
| | 18565 | |
| | 18566 | break :msg msg; |
| | 18567 | }; |
| | 18568 | return sema.failWithOwnedErrorMsg(block, msg); |
| | 18569 | } |
| | 18570 | |
| 18531 | const runtime_src = if (maybe_undef_array_ptr_val != null) elem_index_src else array_ptr_src; | 18571 | const runtime_src = if (maybe_undef_array_ptr_val != null) elem_index_src else array_ptr_src; |
| 18532 | try sema.requireRuntimeBlock(block, runtime_src); | 18572 | try sema.requireRuntimeBlock(block, runtime_src); |
| 18533 | if (block.wantSafety()) { | 18573 | if (block.wantSafety()) { |