authorgravatar for r00ster91@proton.meWooster <r00ster91@proton.me> 2023-04-29 02:12:42+02:00
committergravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2023-04-29 14:28:36+03:00
logdff6efe3697581beffa2604f68900768da5c0297
tree07d96f941d5deff564c18bddabd5b8dff535c7ea
parent05f9608115a48fb7312ebf38c1240ae10b770c88

Sema: disallow indexing non-tuple struct

Fixes #15497

2 files changed, 18 insertions(+), 1 deletions(-)

src/Sema.zig+7-1
...@@ -24597,10 +24597,15 @@ fn elemPtr(...@@ -24597,10 +24597,15 @@ fn elemPtr(
24597 const indexable_ptr_src = src; // TODO better source location24597 const indexable_ptr_src = src; // TODO better source location
24598 const indexable_ptr_ty = sema.typeOf(indexable_ptr);24598 const indexable_ptr_ty = sema.typeOf(indexable_ptr);
24599 const target = sema.mod.getTarget();24599 const target = sema.mod.getTarget();
24600
24600 const indexable_ty = switch (indexable_ptr_ty.zigTypeTag()) {24601 const indexable_ty = switch (indexable_ptr_ty.zigTypeTag()) {
24601 .Pointer => indexable_ptr_ty.elemType(),24602 .Pointer => indexable_ptr_ty.elemType(),
24602 else => return sema.fail(block, indexable_ptr_src, "expected pointer, found '{}'", .{indexable_ptr_ty.fmt(sema.mod)}),24603 else => return sema.fail(block, indexable_ptr_src, "expected pointer, found '{}'", .{indexable_ptr_ty.fmt(sema.mod)}),
24603 };24604 };
24605 if (!indexable_ty.isIndexable()) {
24606 return sema.fail(block, src, "element access of non-indexable type '{}'", .{indexable_ty.fmt(sema.mod)});
24607 }
24608
24604 switch (indexable_ty.zigTypeTag()) {24609 switch (indexable_ty.zigTypeTag()) {
24605 .Array, .Vector => return sema.elemPtrArray(block, src, indexable_ptr_src, indexable_ptr, elem_index_src, elem_index, init, oob_safety),24610 .Array, .Vector => return sema.elemPtrArray(block, src, indexable_ptr_src, indexable_ptr, elem_index_src, elem_index, init, oob_safety),
24606 .Struct => {24611 .Struct => {
...@@ -24629,10 +24634,11 @@ fn elemPtrOneLayerOnly(...@@ -24629,10 +24634,11 @@ fn elemPtrOneLayerOnly(
24629) CompileError!Air.Inst.Ref {24634) CompileError!Air.Inst.Ref {
24630 const indexable_src = src; // TODO better source location24635 const indexable_src = src; // TODO better source location
24631 const indexable_ty = sema.typeOf(indexable);24636 const indexable_ty = sema.typeOf(indexable);
24637 const target = sema.mod.getTarget();
24638
24632 if (!indexable_ty.isIndexable()) {24639 if (!indexable_ty.isIndexable()) {
24633 return sema.fail(block, src, "element access of non-indexable type '{}'", .{indexable_ty.fmt(sema.mod)});24640 return sema.fail(block, src, "element access of non-indexable type '{}'", .{indexable_ty.fmt(sema.mod)});
24634 }24641 }
24635 const target = sema.mod.getTarget();
2463624642
24637 switch (indexable_ty.ptrSize()) {24643 switch (indexable_ty.ptrSize()) {
24638 .Slice => return sema.elemPtrSlice(block, src, indexable_src, indexable, elem_index_src, elem_index, oob_safety),24644 .Slice => return sema.elemPtrSlice(block, src, indexable_src, indexable, elem_index_src, elem_index, oob_safety),
test/cases/compile_errors/indexing_non-tuple_struct.zig created+11
...@@ -0,0 +1,11 @@
1export fn a() void {
2 const S = struct { x: i32, y: i32 };
3 var s: S = undefined;
4 s[0] = 10;
5}
6
7// error
8// backend=stage2
9// target=native
10//
11// :4:6: error: element access of non-indexable type 'tmp.a.S'