From: Rico Tzschichholz Date: Sat, 27 Jan 2018 12:23:53 +0000 (+0100) Subject: codegen: Infer error parameter from abstract/virtual method implementations X-Git-Tag: 0.34.15~6 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=9d570a2358a2f4b500f4bf195dae21d34e32f603;p=thirdparty%2Fvala.git codegen: Infer error parameter from abstract/virtual method implementations https://bugzilla.gnome.org/show_bug.cgi?id=614294 --- diff --git a/codegen/valaccodemethodcallmodule.vala b/codegen/valaccodemethodcallmodule.vala index 3c3b73223..2212814be 100644 --- a/codegen/valaccodemethodcallmodule.vala +++ b/codegen/valaccodemethodcallmodule.vala @@ -615,6 +615,9 @@ public class Vala.CCodeMethodCallModule : CCodeAssignmentModule { current_method_inner_error = true; // add &inner_error before the ellipsis arguments out_arg_map.set (get_param_pos (-1), new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, get_variable_cexpression ("_inner_error_"))); + } else if (m != null && m.has_error_type_parameter ()) { + // inferred error argument from base method + out_arg_map.set (get_param_pos (-1), new CCodeConstant ("NULL")); } if (ellipsis) { diff --git a/codegen/valaccodemethodmodule.vala b/codegen/valaccodemethodmodule.vala index 7f13602e0..974565c7f 100644 --- a/codegen/valaccodemethodmodule.vala +++ b/codegen/valaccodemethodmodule.vala @@ -110,7 +110,7 @@ public abstract class Vala.CCodeMethodModule : CCodeStructModule { } } - if (m.get_error_types ().size > 0 || (m.base_method != null && m.base_method.get_error_types ().size > 0) || (m.base_interface_method != null && m.base_interface_method.get_error_types ().size > 0)) { + if (m.has_error_type_parameter ()) { foreach (DataType error_type in m.get_error_types ()) { generate_type_declaration (error_type, decl_space); } diff --git a/tests/Makefile.am b/tests/Makefile.am index b79f7ec5c..45c3a3a47 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -222,6 +222,7 @@ TESTS = \ asynchronous/bug600827.vala \ asynchronous/bug601558.vala \ asynchronous/bug613484.vala \ + asynchronous/bug614294.vala \ asynchronous/bug620740.vala \ asynchronous/bug639591.vala \ asynchronous/bug640721.vala \ diff --git a/tests/asynchronous/bug614294.vala b/tests/asynchronous/bug614294.vala new file mode 100644 index 000000000..34c50a277 --- /dev/null +++ b/tests/asynchronous/bug614294.vala @@ -0,0 +1,59 @@ +interface IFoo : Object { + public abstract async void foo_async () throws Error; + public abstract void foo () throws Error; +} + +class Bar : Object, IFoo { + public virtual async void foo_async () { + } + public virtual void foo () { + } +} + +class SubBar : Bar { + public override async void foo_async () { + } + public override void foo () { + } +} + +abstract class AFoo : Object { + public abstract async void foo_async () throws Error; + public abstract void foo () throws Error; +} + +class Baz : AFoo { + public override async void foo_async () { + } + public override void foo () { + } +} + +class SubBaz : Baz { + public override async void foo_async () { + } + public override void foo () { + } +} + +async void run () { + var bar = new Bar (); + bar.foo (); + yield bar.foo_async (); + + var subbar = new SubBar (); + subbar.foo (); + yield subbar.foo_async (); + + var baz = new Baz (); + baz.foo (); + yield bar.foo_async (); + + var subbaz = new SubBaz (); + subbaz.foo (); + yield subbaz.foo_async (); +} + +void main () { + run.begin (); +} diff --git a/vala/valamethod.vala b/vala/valamethod.vala index 93dd85793..994f83dc2 100644 --- a/vala/valamethod.vala +++ b/vala/valamethod.vala @@ -1077,6 +1077,19 @@ public class Vala.Method : Subroutine { } } + public bool has_error_type_parameter () { + if (get_error_types ().size > 0) { + return true; + } + if (base_method != null && base_method != this && base_method.has_error_type_parameter ()) { + return true; + } + if (base_interface_method != null && base_interface_method != this && base_interface_method.has_error_type_parameter ()) { + return true; + } + return false; + } + private static string type_to_prototype_string (DataType type) { return "%s%s".printf (type.is_weak () ? "unowned " : "", type.to_qualified_string ()); }