Commit dff6efe369

r00ster91 <r00ster91@proton.me>
2023-04-29 02:12:42
Sema: disallow indexing non-tuple struct
Fixes #15497
1 parent 05f9608
Changed files (2)
src
test
cases
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),
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'