From b00b7bd29037f25ee155f07e74fcb5de44918926 Mon Sep 17 00:00:00 2001 From: Andrew Kelley Date: Sun, 10 Sep 2017 00:34:44 -0400 Subject: [PATCH] variables are allowed to be pointers to opaque --- src/ir.cpp | 6 +++++- test/cases/misc.zig | 9 +++++++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/src/ir.cpp b/src/ir.cpp index 5771fd480d..487f5897e4 100644 --- a/src/ir.cpp +++ b/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: diff --git a/test/cases/misc.zig b/test/cases/misc.zig index a968fd213c..47e7ea5e1b 100644 --- a/test/cases/misc.zig +++ b/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; +}