| author | |
| committer | |
| log | b00b7bd29037f25ee155f07e74fcb5de44918926 |
| tree | 7f8099a954d8ca7b09befe8c2aa2209c20be7d97 |
| parent | b5d9584e6fc9e113435e0d555c2df62379cdcb8b |
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) { | ... | @@ -9828,7 +9828,11 @@ static VarClassRequired get_var_class_required(TypeTableEntry *type_entry) { |
| 9828 | return VarClassRequiredConst; | 9828 | return VarClassRequiredConst; |
| 9829 | 9829 | ||
| 9830 | case TypeTableEntryIdPointer: | 9830 | 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 | } | ||
| 9832 | case TypeTableEntryIdArray: | 9836 | case TypeTableEntryIdArray: |
| 9833 | return get_var_class_required(type_entry->data.array.child_type); | 9837 | return get_var_class_required(type_entry->data.array.child_type); |
| 9834 | case TypeTableEntryIdMaybe: | 9838 | case TypeTableEntryIdMaybe: |
test/cases/misc.zig+9| ... | @@ -546,3 +546,12 @@ test "@OpaqueType" { | ... | @@ -546,3 +546,12 @@ test "@OpaqueType" { |
| 546 | assert(mem.eql(u8, @typeName(OpaqueA), "OpaqueA")); | 546 | assert(mem.eql(u8, @typeName(OpaqueA), "OpaqueA")); |
| 547 | assert(mem.eql(u8, @typeName(OpaqueB), "OpaqueB")); | 547 | assert(mem.eql(u8, @typeName(OpaqueB), "OpaqueB")); |
| 548 | } | 548 | } |
| 549 | |||
| 550 | test "variable is allowed to be a pointer to an opaque type" { | ||
| 551 | var x: i32 = 1234; | ||
| 552 | _ = hereIsAnOpaqueType(@ptrCast(&OpaqueA, &x)); | ||
| 553 | } | ||
| 554 | fn hereIsAnOpaqueType(ptr: &OpaqueA) -> &OpaqueA { | ||
| 555 | var a = ptr; | ||
| 556 | return a; | ||
| 557 | } |