diff --git a/src/check_expr.cpp b/src/check_expr.cpp index 61bf9eeca..dc2e44533 100644 --- a/src/check_expr.cpp +++ b/src/check_expr.cpp @@ -803,6 +803,11 @@ bool is_polymorphic_type_assignable(CheckerContext *c, Type *poly, Type *source, } return true; } + case Type_Opaque: + if (source->kind == Type_Opaque) { + return is_polymorphic_type_assignable(c, poly->Opaque.elem, source->Opaque.elem, true, modify_type); + } + return false; case Type_Pointer: if (source->kind == Type_Pointer) { return is_polymorphic_type_assignable(c, poly->Pointer.elem, source->Pointer.elem, true, modify_type); diff --git a/src/types.cpp b/src/types.cpp index e95fa7c3b..c91bb631c 100644 --- a/src/types.cpp +++ b/src/types.cpp @@ -1127,7 +1127,8 @@ bool is_type_polymorphic(Type *t) { case Type_Named: return is_type_polymorphic(t->Named.base); - + case Type_Opaque: + return is_type_polymorphic(t->Opaque.elem); case Type_Pointer: return is_type_polymorphic(t->Pointer.elem); case Type_Array: @@ -2571,6 +2572,11 @@ gbString write_type_to_string(gbString str, Type *type) { str = write_type_to_string(str, type->Pointer.elem); break; + case Type_Opaque: + str = gb_string_appendc(str, "opaque "); + str = write_type_to_string(str, type->Opaque.elem); + break; + case Type_Array: str = gb_string_appendc(str, gb_bprintf("[%d]", cast(int)type->Array.count)); str = write_type_to_string(str, type->Array.elem);