]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
Fix explicit cast of instance method access to a delegate type
authorLuca Bruno <lucabru@src.gnome.org>
Mon, 11 Jul 2011 20:37:51 +0000 (22:37 +0200)
committerLuca Bruno <lucabru@src.gnome.org>
Mon, 11 Jul 2011 21:02:12 +0000 (23:02 +0200)
Fixes bug 539166.

tests/Makefile.am
tests/delegates/bug539166.vala [new file with mode: 0644]
vala/valacastexpression.vala

index 7bc47e4f3aa851c5b8b142e63b5e71be374844ed..02911887f7345fbed3ca7970663c22d24d0a4cbe 100644 (file)
@@ -68,6 +68,7 @@ TESTS = \
        structs/bug623092.vala \
        structs/bug651441.vala \
        delegates/delegates.vala \
+       delegates/bug539166.vala \
        delegates/bug595610.vala \
        delegates/bug595639.vala \
        delegates/bug638415.vala \
diff --git a/tests/delegates/bug539166.vala b/tests/delegates/bug539166.vala
new file mode 100644 (file)
index 0000000..de764a2
--- /dev/null
@@ -0,0 +1,16 @@
+delegate void Deleg ();
+
+class Foo : Object {
+       public Object baz = new Object ();
+
+       public void bar () {
+               assert (baz != null);
+       }
+}
+
+void main () {
+       var foo = new Foo ();
+       var deleg = (Deleg) foo.bar;
+       foo = null;
+       deleg ();
+}
index c3e622b1c5f8bfe1a57ffb597517389147509ef7..ca5f2a1be0732143d8874400416344326b325856 100644 (file)
@@ -137,6 +137,14 @@ public class Vala.CastExpression : Expression {
 
                // FIXME: check whether cast is allowed
 
+               if (type_reference is DelegateType && inner.value_type is MethodType) {
+                       if (target_type != null) {
+                               inner.value_type.value_owned = target_type.value_owned;
+                       } else {
+                               inner.value_type.value_owned = true;
+                       }
+               }
+
                value_type = type_reference;
                value_type.value_owned = inner.value_type.value_owned;