Commit b00b7bd290

Andrew Kelley <superjoe30@gmail.com>
2017-09-10 06:34:44
variables are allowed to be pointers to opaque
1 parent b5d9584
Changed files (2)
src
test
cases
src/ir.cpp
@@ -9828,7 +9828,11 @@ static VarClassRequired get_var_class_required(TypeTableEntry *type_entry) {
             return VarClassRequiredConst;
 
         case TypeTableEntryIdPointer:
-            return get_var_class_required(type_entry->data.pointer.child_type);
+            if (type_entry->data.pointer.child_type->id == TypeTableEntryIdOpaque) {
+                return VarClassRequiredAny;
+            } else {
+                return get_var_class_required(type_entry->data.pointer.child_type);
+            }
         case TypeTableEntryIdArray:
             return get_var_class_required(type_entry->data.array.child_type);
         case TypeTableEntryIdMaybe:
test/cases/misc.zig
@@ -546,3 +546,12 @@ test "@OpaqueType" {
     assert(mem.eql(u8, @typeName(OpaqueA), "OpaqueA"));
     assert(mem.eql(u8, @typeName(OpaqueB), "OpaqueB"));
 }
+
+test "variable is allowed to be a pointer to an opaque type" {
+    var x: i32 = 1234;
+    _ = hereIsAnOpaqueType(@ptrCast(&OpaqueA, &x));
+}
+fn hereIsAnOpaqueType(ptr: &OpaqueA) -> &OpaqueA {
+    var a = ptr;
+    return a;
+}