Commit b46efcde82

LemonBoy <thatlemon@gmail.com>
2020-02-25 12:22:21
ir: Fix sizeOf comparison with ptr to zst
Closes #4536
1 parent 26b2e5f
Changed files (2)
src
test
stage1
src/analyze.cpp
@@ -1132,10 +1132,9 @@ Error type_val_resolve_zero_bits(CodeGen *g, ZigValue *type_val, ZigType *parent
     if (type_val->special != ConstValSpecialLazy) {
         assert(type_val->special == ConstValSpecialStatic);
         if ((type_val->data.x_type->id == ZigTypeIdStruct &&
-            type_val->data.x_type->data.structure.resolve_loop_flag_zero_bits) ||
+             type_val->data.x_type->data.structure.resolve_loop_flag_zero_bits) ||
             (type_val->data.x_type->id == ZigTypeIdUnion &&
-             type_val->data.x_type->data.unionation.resolve_loop_flag_zero_bits) ||
-            type_val->data.x_type->id == ZigTypeIdPointer)
+             type_val->data.x_type->data.unionation.resolve_loop_flag_zero_bits))
         {
             // Does a struct/union which contains a pointer field to itself have bits? Yes.
             *is_zero_bits = false;
test/stage1/behavior/sizeof_and_typeof.zig
@@ -1,5 +1,7 @@
-const builtin = @import("builtin");
-const expect = @import("std").testing.expect;
+const std = @import("std");
+const builtin = std.builtin;
+const expect = std.testing.expect;
+const expectEqual = std.testing.expectEqual;
 
 test "@sizeOf and @TypeOf" {
     const y: @TypeOf(x) = 120;
@@ -135,3 +137,31 @@ test "@bitSizeOf" {
         a: u2
     }) == 2);
 }
+
+test "@sizeOf comparison against zero" {
+    const S0 = struct {
+        f: *@This(),
+    };
+    const U0 = union {
+        f: *@This(),
+    };
+    const S = struct {
+        fn doTheTest(comptime T: type, comptime result: bool) void {
+            expectEqual(result, @sizeOf(T) > 0);
+        }
+    };
+    // Zero-sized type
+    S.doTheTest(u0, false);
+    S.doTheTest(*u0, false);
+    // Non byte-sized type
+    S.doTheTest(u1, true);
+    S.doTheTest(*u1, true);
+    // Regular type
+    S.doTheTest(u8, true);
+    S.doTheTest(*u8, true);
+    S.doTheTest(f32, true);
+    S.doTheTest(*f32, true);
+    // Container with ptr pointing to themselves
+    S.doTheTest(S0, true);
+    S.doTheTest(U0, true);
+}