aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorVeikka Tuominen <git@vexu.eu>2022-05-26 13:07:51 +0300
committerVeikka Tuominen <git@vexu.eu>2022-05-27 10:29:15 +0300
commite08cdad53b25876b247322aed91257288e8b9230 (patch)
treee212a7b592d0344ea80d730aca4df14135e4747d /src
parent92c4e4f2c234816a70472250702f834a1842f4e6 (diff)
downloadzig-e08cdad53b25876b247322aed91257288e8b9230.tar.gz
zig-e08cdad53b25876b247322aed91257288e8b9230.zip
Sema: add error for runtime indexing comptime array
Diffstat (limited to 'src')
-rw-r--r--src/Sema.zig42
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()) {