From: Rico Tzschichholz Date: Fri, 24 Mar 2017 06:56:25 +0000 (+0100) Subject: codegen: Don't allow assigning delegate if no target/closure is available X-Git-Tag: 0.37.1~14 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=9e2cd62d98b212067c8b3c2c644bc56903109aee;p=thirdparty%2Fvala.git codegen: Don't allow assigning delegate if no target/closure is available https://bugzilla.gnome.org/show_bug.cgi?id=598869 --- diff --git a/codegen/valaccodeassignmentmodule.vala b/codegen/valaccodeassignmentmodule.vala index 718cd71a1..6e9ce0dd1 100644 --- a/codegen/valaccodeassignmentmodule.vala +++ b/codegen/valaccodeassignmentmodule.vala @@ -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) { diff --git a/tests/Makefile.am b/tests/Makefile.am index bf30775ce..50708d172 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -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 index 000000000..328814a54 --- /dev/null +++ b/tests/delegates/bug598869.test @@ -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; +}