From eb0b41fdda53e48c67031cb42f30698ef4e02007 Mon Sep 17 00:00:00 2001 From: Luca Bruno Date: Mon, 11 Jul 2011 22:37:51 +0200 Subject: [PATCH] Fix explicit cast of instance method access to a delegate type Fixes bug 539166. --- tests/Makefile.am | 1 + tests/delegates/bug539166.vala | 16 ++++++++++++++++ vala/valacastexpression.vala | 8 ++++++++ 3 files changed, 25 insertions(+) create mode 100644 tests/delegates/bug539166.vala diff --git a/tests/Makefile.am b/tests/Makefile.am index 7bc47e4f3..02911887f 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -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 index 000000000..de764a25a --- /dev/null +++ b/tests/delegates/bug539166.vala @@ -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 (); +} diff --git a/vala/valacastexpression.vala b/vala/valacastexpression.vala index c3e622b1c..ca5f2a1be 100644 --- a/vala/valacastexpression.vala +++ b/vala/valacastexpression.vala @@ -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; -- 2.47.2