var ref_call = new CCodeFunctionCall (get_dup_func_expression (expr.inner.value_type, expr.source_reference));
ref_call.add_argument (delegate_target);
delegate_target = ref_call;
- if (delegate_type != null && delegate_type.is_disposable ()) {
- set_delegate_target_destroy_notify (expr, get_destroy_func_expression (expr.inner.value_type));
- }
+ set_delegate_target_destroy_notify (expr, get_destroy_func_expression (expr.inner.value_type));
}
set_delegate_target (expr, delegate_target);
}
--- /dev/null
+delegate void FooFunc ();
+
+[CCode (has_target = false)]
+delegate void FooFuncTargetless ();
+
+class Foo : Object {
+ public Foo () {
+ baz (func);
+ assert (ref_count == 1);
+
+ bar (func);
+ assert (ref_count == 1);
+
+ baz ((FooFunc) func);
+ assert (ref_count == 1);
+
+ bar ((FooFunc) func);
+ assert (ref_count == 1);
+
+ man ((FooFuncTargetless) func);
+ assert (ref_count == 1);
+
+ maz ((FooFuncTargetless) func);
+ assert (ref_count == 1);
+ }
+
+ public void func () {
+ }
+
+ void baz (FooFunc f) {
+ assert (ref_count == 1);
+ }
+
+ void bar (owned FooFunc f) {
+ assert (ref_count == 2);
+ }
+
+ void man (FooFuncTargetless f) {
+ assert (ref_count == 1);
+ }
+
+ void maz (owned FooFuncTargetless f) {
+ assert (ref_count == 1);
+ }
+}
+
+void func () {
+}
+
+void main () {
+ var foo = new Foo ();
+ assert (foo.ref_count == 1);
+
+ FooFunc f0 = foo.func;
+ assert (foo.ref_count == 2);
+ f0 = null;
+ assert (foo.ref_count == 1);
+
+ var f1 = (FooFunc) foo.func;
+ assert (foo.ref_count == 2);
+ f1 = null;
+ assert (foo.ref_count == 1);
+
+ unowned FooFunc f2 = foo.func;
+ assert (foo.ref_count == 1);
+ f2 = null;
+ assert (foo.ref_count == 1);
+
+ unowned FooFunc f3 = (FooFunc) foo.func;
+ assert (foo.ref_count == 1);
+ f3 = null;
+ assert (foo.ref_count == 1);
+
+ var f4 = (FooFuncTargetless) foo.func;
+ assert (foo.ref_count == 1);
+ f4 = null;
+ assert (foo.ref_count == 1);
+
+ FooFuncTargetless f5 = func;
+ f5 = null;
+
+ var f6 = (FooFuncTargetless) func;
+ f6 = null;
+
+ unowned FooFuncTargetless f7 = func;
+ f7 = null;
+
+ unowned FooFuncTargetless f8 = (FooFuncTargetless) func;
+ f8 = null;
+}