diff options
-rw-r--r-- | codegen/valagsignalmodule.vala | 3 | ||||
-rw-r--r-- | tests/Makefile.am | 1 | ||||
-rw-r--r-- | tests/semantic/signal-disconnect-invalid.test | 10 | ||||
-rw-r--r-- | vala/valamethodcall.vala | 10 |
4 files changed, 21 insertions, 3 deletions
diff --git a/codegen/valagsignalmodule.vala b/codegen/valagsignalmodule.vala index c4c046a17..822519030 100644 --- a/codegen/valagsignalmodule.vala +++ b/codegen/valagsignalmodule.vala @@ -627,9 +627,6 @@ public class Vala.GSignalModule : GObjectModule { } } else { // disconnect - if (handler is LambdaExpression) { - Report.error (handler.source_reference, "Cannot disconnect lambda expression from signal. Use Object.disconnect."); - } if (sig is DynamicSignal) { connect_func = get_dynamic_signal_disconnect_wrapper_name ((DynamicSignal) sig); } else { diff --git a/tests/Makefile.am b/tests/Makefile.am index e54e87227..77f4da866 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -699,6 +699,7 @@ TESTS = \ semantic/signal-detail-invalid.test \ semantic/signal-detail-non-string.test \ semantic/struct-derived.test \ + semantic/signal-disconnect-invalid.test \ semantic/struct-field-initializer.test \ semantic/struct-invalid-base.test \ semantic/struct-recursive.test \ diff --git a/tests/semantic/signal-disconnect-invalid.test b/tests/semantic/signal-disconnect-invalid.test new file mode 100644 index 000000000..2d3883840 --- /dev/null +++ b/tests/semantic/signal-disconnect-invalid.test @@ -0,0 +1,10 @@ +Invalid Code + +class Foo : Object { + public signal void bar (); +} + +void main () { + var foo = new Foo (); + foo.bar.disconnect (() => {}); +} diff --git a/vala/valamethodcall.vala b/vala/valamethodcall.vala index af44a2a5b..80d0d772f 100644 --- a/vala/valamethodcall.vala +++ b/vala/valamethodcall.vala @@ -535,6 +535,16 @@ public class Vala.MethodCall : Expression { value_type.nullable = true; } + unowned Signal? sig = m.parent_symbol as Signal; + if (sig != null && m.name == "disconnect") { + var param = get_argument_list ()[0]; + if (param is LambdaExpression) { + error = true; + Report.error (source_reference, "Cannot disconnect lambda expression from signal"); + return false; + } + } + var dynamic_sig = m.parent_symbol as DynamicSignal; if (dynamic_sig != null && dynamic_sig.handler != null) { dynamic_sig.return_type = dynamic_sig.handler.value_type.get_return_type ().copy (); |