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; +}