From: Adam Folmert Date: Fri, 12 Feb 2010 10:10:33 +0000 (+0100) Subject: Fix protected member access in interfaces X-Git-Tag: 0.8.0~88 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=c007777b3b63958929a0d424173d2fe98edeae92;p=thirdparty%2Fvala.git Fix protected member access in interfaces Fixes bug 609726. --- diff --git a/tests/objects/interfaces.vala b/tests/objects/interfaces.vala index d9fcdb9c5..e6895d68b 100644 --- a/tests/objects/interfaces.vala +++ b/tests/objects/interfaces.vala @@ -4,6 +4,21 @@ interface Maman.Ibaz : Object { public abstract void do_action (); public abstract void do_virtual_action (); + + protected void protected_mixin_1() { + stdout.puts("protected_mixin_1\n"); + protected_mixin_2(); + } + + protected void protected_mixin_2() { + stdout.puts("protected_mixin_2\n"); + } + + public void public_mixin() { + protected_mixin_1(); + protected_mixin_2(); + + } } class Maman.Baz : Object, Ibaz { @@ -14,6 +29,10 @@ class Maman.Baz : Object, Ibaz { public virtual void do_virtual_action () { stdout.printf (" 4"); } + + public void do_mixin() { + public_mixin(); + } } class Maman.SubBaz : Baz { @@ -21,11 +40,13 @@ class Maman.SubBaz : Baz { stdout.printf (" 6"); } - public static int main () { + public static int main_func () { stdout.printf ("Interface Test: 1"); Ibaz ibaz = new Baz (); ibaz.do_action (); + ibaz.public_mixin(); + (ibaz as Baz).do_mixin(); stdout.printf (" 3"); @@ -38,11 +59,14 @@ class Maman.SubBaz : Baz { stdout.printf (" 7\n"); + subbaz.public_mixin(); + (subbaz as Baz).public_mixin(); + return 0; } } void main () { - Maman.SubBaz.main (); + Maman.SubBaz.main_func (); } diff --git a/vala/valamemberaccess.vala b/vala/valamemberaccess.vala index 981981ef7..2914eba83 100644 --- a/vala/valamemberaccess.vala +++ b/vala/valamemberaccess.vala @@ -637,6 +637,13 @@ public class Vala.MemberAccess : Expression { bool in_subtype = false; for (Symbol this_symbol = analyzer.current_symbol; this_symbol != null; this_symbol = this_symbol.parent_symbol) { + if (this_symbol == target_type) { + // required for interfaces with non-abstract methods + // accessing protected interface members + in_subtype = true; + break; + } + var cl = this_symbol as Class; if (cl != null && cl.is_subtype_of (target_type)) { in_subtype = true;