Commit 11ca38a4e9

Andrew Kelley <superjoe30@gmail.com>
2018-06-26 21:27:41
fix crash for optional pointer to empty struct
closes #1153
1 parent af95e15
Changed files (3)
src/ir.cpp
@@ -7985,9 +7985,10 @@ static ConstCastOnly types_match_const_cast_only(IrAnalyze *ira, TypeTableEntry
 
     // * and [*] can do a const-cast-only to ?* and ?[*], respectively
     // but not if there is a mutable parent pointer
+    // and not if the pointer is zero bits
     if (!wanted_is_mutable && wanted_type->id == TypeTableEntryIdOptional &&
         wanted_type->data.maybe.child_type->id == TypeTableEntryIdPointer &&
-        actual_type->id == TypeTableEntryIdPointer)
+        actual_type->id == TypeTableEntryIdPointer && type_has_bits(actual_type))
     {
         ConstCastOnly child = types_match_const_cast_only(ira,
                 wanted_type->data.maybe.child_type, actual_type, source_node, wanted_is_mutable);
test/cases/optional.zig
@@ -0,0 +1,9 @@
+const assert = @import("std").debug.assert;
+
+pub const EmptyStruct = struct {};
+
+test "optional pointer to size zero struct" {
+    var e = EmptyStruct{};
+    var o: ?*EmptyStruct = &e;
+    assert(o != null);
+}
test/behavior.zig
@@ -35,6 +35,7 @@ comptime {
     _ = @import("cases/math.zig");
     _ = @import("cases/merge_error_sets.zig");
     _ = @import("cases/misc.zig");
+    _ = @import("cases/optional.zig");
     _ = @import("cases/namespace_depends_on_compile_var/index.zig");
     _ = @import("cases/new_stack_call.zig");
     _ = @import("cases/null.zig");