]> Nishi Git Mirror - gwion.git/commitdiff
:bug: Prevent inheritance from abstract type
authorfennecdjay <fennecdjay@gwion.tk>
Fri, 23 Oct 2020 09:31:47 +0000 (11:31 +0200)
committerfennecdjay <fennecdjay@gwion.tk>
Fri, 23 Oct 2020 09:31:47 +0000 (11:31 +0200)
src/parse/scan0.c
tests/error/find_type.gw
tests/error/no_inherit.gw [new file with mode: 0644]

index 4cfecfdd80cee7911b3a2dbd5d0ef5b9a04d7a77..6047da5f12b0c323dcd21411bbba626622146414 100644 (file)
@@ -322,6 +322,13 @@ ANN static Type get_parent_base(const Env env, Type_Decl *td) {
   return t;
 }
 
+ANN static Type check_abstract(const Env env, Type_Decl *td) {
+  DECL_OO(const Type, t, = known_type(env, td))
+  if(!GET_FLAG(t, abstract)) // could be final
+    return t;
+  ERR_O(td_pos(td), _("can't inherit from abstract parent class '%s'\n."), t->name);
+}
+
 ANN static Type get_parent(const Env env, const Class_Def cdef) {
   if(GET_FLAG(cdef, struct))
     return env->gwion->type[et_compound];
@@ -331,7 +338,7 @@ ANN static Type get_parent(const Env env, const Class_Def cdef) {
     return get_parent_base(env, cdef->base.ext);
   if(cdef->base.tmpl)
     template_push_types(env, cdef->base.tmpl);
-  const Type t = known_type(env, cdef->base.ext);
+  const Type t = check_abstract(env, cdef->base.ext);
   if(cdef->base.tmpl)
     nspc_pop_type(env->gwion->mp, env->curr);
   return t ?: (Type)GW_ERROR;
index b587462fc0c87e67e0a7de5117472faabfdaf999..b6f87553462ea87d95bfa8690063d19ee45421a7 100644 (file)
@@ -1,4 +1,4 @@
 #! [contains] unknown type
-class C extends UGen {
+class C extends UserUGen {
   var D d;
 }
diff --git a/tests/error/no_inherit.gw b/tests/error/no_inherit.gw
new file mode 100644 (file)
index 0000000..d37f627
--- /dev/null
@@ -0,0 +1,7 @@
+#! [contains] can't inherit
+class C extends TypedFork:[int] {
+
+}
+
+var C c;
+c.exit();