Browse Source

Allow `opaque` to be polymorphic

gingerBill 6 years ago
parent
commit
f61c4715c1
2 changed files with 12 additions and 1 deletions
  1. 5 0
      src/check_expr.cpp
  2. 7 1
      src/types.cpp

+ 5 - 0
src/check_expr.cpp

@@ -803,6 +803,11 @@ bool is_polymorphic_type_assignable(CheckerContext *c, Type *poly, Type *source,
 		}
 		}
 		return true;
 		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:
 	case Type_Pointer:
 		if (source->kind == Type_Pointer) {
 		if (source->kind == Type_Pointer) {
 			return is_polymorphic_type_assignable(c, poly->Pointer.elem, source->Pointer.elem, true, modify_type);
 			return is_polymorphic_type_assignable(c, poly->Pointer.elem, source->Pointer.elem, true, modify_type);

+ 7 - 1
src/types.cpp

@@ -1127,7 +1127,8 @@ bool is_type_polymorphic(Type *t) {
 
 
 	case Type_Named:
 	case Type_Named:
 		return is_type_polymorphic(t->Named.base);
 		return is_type_polymorphic(t->Named.base);
-
+	case Type_Opaque:
+		return is_type_polymorphic(t->Opaque.elem);
 	case Type_Pointer:
 	case Type_Pointer:
 		return is_type_polymorphic(t->Pointer.elem);
 		return is_type_polymorphic(t->Pointer.elem);
 	case Type_Array:
 	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);
 		str = write_type_to_string(str, type->Pointer.elem);
 		break;
 		break;
 
 
+	case Type_Opaque:
+		str = gb_string_appendc(str, "opaque ");
+		str = write_type_to_string(str, type->Opaque.elem);
+		break;
+
 	case Type_Array:
 	case Type_Array:
 		str = gb_string_appendc(str, gb_bprintf("[%d]", cast(int)type->Array.count));
 		str = gb_string_appendc(str, gb_bprintf("[%d]", cast(int)type->Array.count));
 		str = write_type_to_string(str, type->Array.elem);
 		str = write_type_to_string(str, type->Array.elem);