]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
vala: Improve check of expression passed to yield
authorRico Tzschichholz <ricotz@ubuntu.com>
Mon, 20 Jul 2020 08:37:53 +0000 (10:37 +0200)
committerRico Tzschichholz <ricotz@ubuntu.com>
Sun, 26 Jul 2020 10:28:05 +0000 (12:28 +0200)
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

tests/Makefile.am
tests/semantic/yield-call-requires-async-method-2.test [new file with mode: 0644]
vala/valamethodcall.vala

index 9de3eb472e495ee4db9b434a1f9ffa9e2ac8b75f..ff8d228b1a26b5850f7c12f94402bfa1edba82d7 100644 (file)
@@ -838,6 +838,7 @@ TESTS = \
        semantic/unary-unsupported-negation.test \
        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 \
        $(NULL)
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 (file)
index 0000000..f3d1fe6
--- /dev/null
@@ -0,0 +1,12 @@
+Invalid Code
+
+class Foo {
+       signal void bar ();
+
+       void run () {
+               yield bar ();
+       }
+}
+
+void main () {
+}
index 958254ee5b78cf6b12eef4c8fa7a930d682657b3..69dba11ce7044eae2b162e7b87dbbfab60111eae 100644 (file)
@@ -475,20 +475,21 @@ 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 (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");
+                       }
+               }
+
                bool may_throw = false;
 
                if (mtype is MethodType) {
                        var 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 (m != null && m.coroutine && !is_yield_expression && ((MemberAccess) call).member_name != "end") {
                                // .begin call of async method, no error can happen here
                        } else {