diff options
| -rw-r--r-- | src/Sema.zig | 8 | ||||
| -rw-r--r-- | test/cases/compile_errors/indexing_non-tuple_struct.zig | 11 |
2 files changed, 18 insertions, 1 deletions
diff --git a/src/Sema.zig b/src/Sema.zig index 327ff3800f..df199be97c 100644 --- a/src/Sema.zig +++ b/src/Sema.zig @@ -24597,10 +24597,15 @@ fn elemPtr( const indexable_ptr_src = src; // TODO better source location const indexable_ptr_ty = sema.typeOf(indexable_ptr); const target = sema.mod.getTarget(); + const indexable_ty = switch (indexable_ptr_ty.zigTypeTag()) { .Pointer => indexable_ptr_ty.elemType(), else => return sema.fail(block, indexable_ptr_src, "expected pointer, found '{}'", .{indexable_ptr_ty.fmt(sema.mod)}), }; + if (!indexable_ty.isIndexable()) { + return sema.fail(block, src, "element access of non-indexable type '{}'", .{indexable_ty.fmt(sema.mod)}); + } + switch (indexable_ty.zigTypeTag()) { .Array, .Vector => return sema.elemPtrArray(block, src, indexable_ptr_src, indexable_ptr, elem_index_src, elem_index, init, oob_safety), .Struct => { @@ -24629,10 +24634,11 @@ fn elemPtrOneLayerOnly( ) CompileError!Air.Inst.Ref { const indexable_src = src; // TODO better source location const indexable_ty = sema.typeOf(indexable); + const target = sema.mod.getTarget(); + if (!indexable_ty.isIndexable()) { return sema.fail(block, src, "element access of non-indexable type '{}'", .{indexable_ty.fmt(sema.mod)}); } - const target = sema.mod.getTarget(); switch (indexable_ty.ptrSize()) { .Slice => return sema.elemPtrSlice(block, src, indexable_src, indexable, elem_index_src, elem_index, oob_safety), diff --git a/test/cases/compile_errors/indexing_non-tuple_struct.zig b/test/cases/compile_errors/indexing_non-tuple_struct.zig new file mode 100644 index 0000000000..912ee689d1 --- /dev/null +++ b/test/cases/compile_errors/indexing_non-tuple_struct.zig @@ -0,0 +1,11 @@ +export fn a() void { + const S = struct { x: i32, y: i32 }; + var s: S = undefined; + s[0] = 10; +} + +// error +// backend=stage2 +// target=native +// +// :4:6: error: element access of non-indexable type 'tmp.a.S' |
