]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
codegen: Don't allow assigning delegate if no target/closure is available
authorRico Tzschichholz <ricotz@ubuntu.com>
Fri, 24 Mar 2017 06:56:25 +0000 (07:56 +0100)
committerRico Tzschichholz <ricotz@ubuntu.com>
Mon, 19 Jun 2017 18:34:44 +0000 (20:34 +0200)
https://bugzilla.gnome.org/show_bug.cgi?id=598869

codegen/valaccodeassignmentmodule.vala
tests/Makefile.am
tests/delegates/bug598869.test [new file with mode: 0644]

index 718cd71a1d3ebe1b1dbf17a72897d2ef09de7f3b..6e9ce0dd15b36fcd84d3e32110e5a07a2a850d9f 100644 (file)
@@ -147,8 +147,15 @@ public class Vala.CCodeAssignmentModule : CCodeMemberAccessModule {
 
                var delegate_type = lvalue.value_type as DelegateType;
                if (delegate_type != null && delegate_type.delegate_symbol.has_target) {
-                       if (get_delegate_target_cvalue (lvalue) != null) {
-                               ccode.add_assignment (get_delegate_target_cvalue (lvalue), get_delegate_target_cvalue (value));
+                       var lvalue_target = get_delegate_target_cvalue (lvalue);
+                       var rvalue_target = get_delegate_target_cvalue (value);
+                       if (lvalue_target != null) {
+                               if (rvalue_target != null) {
+                                       ccode.add_assignment (lvalue_target, rvalue_target);
+                               } else {
+                                       Report.error (source_reference, "Assigning delegate without required target in scope");
+                                       ccode.add_assignment (lvalue_target, new CCodeInvalidExpression ());
+                               }
                                var lvalue_destroy_notify = get_delegate_target_destroy_notify_cvalue (lvalue);
                                var rvalue_destroy_notify = get_delegate_target_destroy_notify_cvalue (value);
                                if (lvalue_destroy_notify != null) {
index bf30775ce489842e95e800ee4566bc103c003f3b..50708d172a5a0c80de190f9a1ef11fe4677e764b 100644 (file)
@@ -153,6 +153,7 @@ TESTS = \
        delegates/bug539166.vala \
        delegates/bug595610.vala \
        delegates/bug595639.vala \
+       delegates/bug598869.test \
        delegates/bug638415.vala \
        delegates/bug639751.vala \
        delegates/bug659778.vala \
diff --git a/tests/delegates/bug598869.test b/tests/delegates/bug598869.test
new file mode 100644 (file)
index 0000000..328814a
--- /dev/null
@@ -0,0 +1,17 @@
+Invalid Code
+
+delegate void FooFunc (int i);
+
+class Foo {
+       public FooFunc func;
+}
+
+class Bar {
+       public void baz (int i) {
+       }
+}
+
+void main () {
+       var foo = new Foo ();
+       foo.func = Bar.baz;
+}