From 3c46988e0dbca6c072633de40bc3cd2cd918f2c1 Mon Sep 17 00:00:00 2001 From: Juerg Billeter Date: Mon, 7 Apr 2008 14:21:50 +0000 Subject: fix spurious error when overriding abstract method in derived abstract 2008-04-07 Juerg Billeter * vala/valasemanticanalyzer.vala: fix spurious error when overriding abstract method in derived abstract class, fixes bug 523263 * tests/classes-methods.vala: test overriding abstract method in derived abstract class svn path=/trunk/; revision=1172 --- ChangeLog | 9 +++++++++ tests/classes-methods.vala | 14 ++++++++++++++ vala/valasemanticanalyzer.vala | 12 +++++++----- 3 files changed, 30 insertions(+), 5 deletions(-) diff --git a/ChangeLog b/ChangeLog index 1acf1733a..ad16e8b89 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,12 @@ +2008-04-07 Jürg Billeter + + * vala/valasemanticanalyzer.vala: fix spurious error when + overriding abstract method in derived abstract class, + fixes bug 523263 + + * tests/classes-methods.vala: test overriding abstract method in + derived abstract class + 2008-04-07 Jürg Billeter * vala/valasemanticanalyzer.vala: check accessiblity of property diff --git a/tests/classes-methods.vala b/tests/classes-methods.vala index 163790864..3226c1c87 100644 --- a/tests/classes-methods.vala +++ b/tests/classes-methods.vala @@ -77,3 +77,17 @@ class Maman.FooBar : Object { class Maman.SubFooBar : FooBar, Foo { } +// http://bugzilla.gnome.org/show_bug.cgi?id=523263 + +abstract class Maman.AbstractBase : Object { + public abstract void foo (); +} + +abstract class Maman.AbstractDerived : AbstractBase { + public override void foo () { + } +} + +class Maman.DeepDerived : AbstractDerived { +} + diff --git a/vala/valasemanticanalyzer.vala b/vala/valasemanticanalyzer.vala index 882a7af87..2f0b435d2 100644 --- a/vala/valasemanticanalyzer.vala +++ b/vala/valasemanticanalyzer.vala @@ -197,12 +197,14 @@ public class Vala.SemanticAnalyzer : CodeVisitor { if (!cl.is_abstract) { var base_class = cl.base_class; while (base_class != null && base_class.is_abstract) { - foreach (Method m in base_class.get_methods ()) { - if (m.is_abstract) { - var sym = cl.scope.lookup (m.name); - if (sym == null || !(sym is Method) || ((Method) sym).base_method != m) { + foreach (Method base_method in base_class.get_methods ()) { + if (base_method.is_abstract) { + var override_method = symbol_lookup_inherited (cl, base_method.name) as Method; + if (override_method == null + || !override_method.overrides + || override_method.base_method != base_method) { cl.error = true; - Report.error (cl.source_reference, "`%s' does not implement abstract method `%s'".printf (cl.get_full_name (), m.get_full_name ())); + Report.error (cl.source_reference, "`%s' does not implement abstract method `%s'".printf (cl.get_full_name (), base_method.get_full_name ())); } } } -- cgit v1.2.1