authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2017-09-10 00:34:44-04:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2017-09-10 00:34:44-04:00
logb00b7bd29037f25ee155f07e74fcb5de44918926
tree7f8099a954d8ca7b09befe8c2aa2209c20be7d97
parentb5d9584e6fc9e113435e0d555c2df62379cdcb8b

variables are allowed to be pointers to opaque


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

src/ir.cpp+5-1
......@@ -9828,7 +9828,11 @@ static VarClassRequired get_var_class_required(TypeTableEntry *type_entry) {
98289828 return VarClassRequiredConst;
98299829
98309830 case TypeTableEntryIdPointer:
9831 return get_var_class_required(type_entry->data.pointer.child_type);
9831 if (type_entry->data.pointer.child_type->id == TypeTableEntryIdOpaque) {
9832 return VarClassRequiredAny;
9833 } else {
9834 return get_var_class_required(type_entry->data.pointer.child_type);
9835 }
98329836 case TypeTableEntryIdArray:
98339837 return get_var_class_required(type_entry->data.array.child_type);
98349838 case TypeTableEntryIdMaybe:
test/cases/misc.zig+9
......@@ -546,3 +546,12 @@ test "@OpaqueType" {
546546 assert(mem.eql(u8, @typeName(OpaqueA), "OpaqueA"));
547547 assert(mem.eql(u8, @typeName(OpaqueB), "OpaqueB"));
548548}
549
550test "variable is allowed to be a pointer to an opaque type" {
551 var x: i32 = 1234;
552 _ = hereIsAnOpaqueType(@ptrCast(&OpaqueA, &x));
553}
554fn hereIsAnOpaqueType(ptr: &OpaqueA) -> &OpaqueA {
555 var a = ptr;
556 return a;
557}