From: Rico Tzschichholz Date: Mon, 20 Jul 2020 08:37:53 +0000 (+0200) Subject: vala: Improve check of expression passed to yield X-Git-Tag: 0.49.1~26 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=29e6a79ef827c0dba5d3efd35c84b5f1b5410ab3;p=thirdparty%2Fvala.git vala: Improve check of expression passed to yield Report a proper error and fix codegen cricical when a signal is given: vala_ccode_function_add_expression: assertion 'expression != NULL' failed See https://gitlab.gnome.org/GNOME/vala/issues/1039 --- diff --git a/tests/Makefile.am b/tests/Makefile.am index d80ef2ed0..c3fb9cfdc 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -981,6 +981,7 @@ TESTS = \ semantic/with-value.vala \ semantic/yield-call-requires-async-context.test \ semantic/yield-call-requires-async-method.test \ + semantic/yield-call-requires-async-method-2.test \ semantic/yield-creation-requires-async-context.test \ semantic/yield-creation-requires-async-method.test \ semantic/yield-statement-requires-async-context.test \ diff --git a/tests/semantic/yield-call-requires-async-method-2.test b/tests/semantic/yield-call-requires-async-method-2.test new file mode 100644 index 000000000..f3d1fe67d --- /dev/null +++ b/tests/semantic/yield-call-requires-async-method-2.test @@ -0,0 +1,12 @@ +Invalid Code + +class Foo { + signal void bar (); + + void run () { + yield bar (); + } +} + +void main () { +} diff --git a/vala/valamethodcall.vala b/vala/valamethodcall.vala index aeacb958a..d7b58ac85 100644 --- a/vala/valamethodcall.vala +++ b/vala/valamethodcall.vala @@ -510,19 +510,19 @@ public class Vala.MethodCall : Expression { formal_value_type = ret_type.copy (); value_type = formal_value_type.get_actual_type (target_object_type, method_type_args, this); - if (mtype is MethodType) { - unowned Method m = ((MethodType) mtype).method_symbol; - if (is_yield_expression) { - if (!m.coroutine) { - error = true; - Report.error (source_reference, "yield expression requires async method"); - } - if (context.analyzer.current_method == null || !context.analyzer.current_method.coroutine) { - error = true; - Report.error (source_reference, "yield expression not available outside async method"); - } + if (is_yield_expression) { + if (!(mtype is MethodType) || !((MethodType) mtype).method_symbol.coroutine) { + error = true; + Report.error (source_reference, "yield expression requires async method"); + } + if (context.analyzer.current_method == null || !context.analyzer.current_method.coroutine) { + error = true; + Report.error (source_reference, "yield expression not available outside async method"); } + } + if (mtype is MethodType) { + unowned Method m = ((MethodType) mtype).method_symbol; if (m.returns_floating_reference) { value_type.floating_reference = true; }