}
} 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 {
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 \
--- /dev/null
+Invalid Code
+
+class Foo : Object {
+ public signal void bar ();
+}
+
+void main () {
+ var foo = new Foo ();
+ foo.bar.disconnect (() => {});
+}
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 ();