diff options
| author | Veikka Tuominen <git@vexu.eu> | 2022-05-26 13:07:51 +0300 |
|---|---|---|
| committer | Veikka Tuominen <git@vexu.eu> | 2022-05-27 10:29:15 +0300 |
| commit | e08cdad53b25876b247322aed91257288e8b9230 (patch) | |
| tree | e212a7b592d0344ea80d730aca4df14135e4747d /src | |
| parent | 92c4e4f2c234816a70472250702f834a1842f4e6 (diff) | |
| download | zig-e08cdad53b25876b247322aed91257288e8b9230.tar.gz zig-e08cdad53b25876b247322aed91257288e8b9230.zip | |
Sema: add error for runtime indexing comptime array
Diffstat (limited to 'src')
| -rw-r--r-- | src/Sema.zig | 42 |
1 files changed, 41 insertions, 1 deletions
diff --git a/src/Sema.zig b/src/Sema.zig index 41111cd650..170f1e5631 100644 --- a/src/Sema.zig +++ b/src/Sema.zig @@ -7309,9 +7309,11 @@ fn zirElemVal(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air defer tracy.end(); const bin_inst = sema.code.instructions.items(.data)[inst].bin; + const src = sema.src; // TODO better source location + const elem_index_src = sema.src; // TODO better source location const array = try sema.resolveInst(bin_inst.lhs); const elem_index = try sema.resolveInst(bin_inst.rhs); - return sema.elemVal(block, sema.src, array, elem_index, sema.src); + return sema.elemVal(block, src, array, elem_index, elem_index_src); } fn zirElemValNode(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Inst.Ref { @@ -18473,6 +18475,25 @@ fn elemValArray( } } + const valid_rt = try sema.validateRunTimeType(block, elem_index_src, elem_ty, false); + if (!valid_rt) { + const msg = msg: { + const msg = try sema.errMsg( + block, + elem_index_src, + "values of type '{}' must be comptime known, but index value is runtime known", + .{array_ty.fmt(sema.mod)}, + ); + errdefer msg.destroy(sema.gpa); + + const src_decl = sema.mod.declPtr(block.src_decl); + try sema.explainWhyTypeIsComptime(block, elem_index_src, msg, array_src.toSrcLoc(src_decl), array_ty); + + break :msg msg; + }; + return sema.failWithOwnedErrorMsg(block, msg); + } + const runtime_src = if (maybe_undef_array_val != null) elem_index_src else array_src; try sema.requireRuntimeBlock(block, runtime_src); if (block.wantSafety()) { @@ -18528,6 +18549,25 @@ fn elemPtrArray( } } + const valid_rt = try sema.validateRunTimeType(block, elem_index_src, array_ty.elemType2(), false); + if (!valid_rt) { + const msg = msg: { + const msg = try sema.errMsg( + block, + elem_index_src, + "values of type '{}' must be comptime known, but index value is runtime known", + .{array_ty.fmt(sema.mod)}, + ); + errdefer msg.destroy(sema.gpa); + + const src_decl = sema.mod.declPtr(block.src_decl); + try sema.explainWhyTypeIsComptime(block, elem_index_src, msg, array_ptr_src.toSrcLoc(src_decl), array_ty); + + break :msg msg; + }; + return sema.failWithOwnedErrorMsg(block, msg); + } + const runtime_src = if (maybe_undef_array_ptr_val != null) elem_index_src else array_ptr_src; try sema.requireRuntimeBlock(block, runtime_src); if (block.wantSafety()) { |
