summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJuerg Billeter <j@bitron.ch>2008-04-07 14:21:50 +0000
committerJürg Billeter <juergbi@src.gnome.org>2008-04-07 14:21:50 +0000
commit3c46988e0dbca6c072633de40bc3cd2cd918f2c1 (patch)
tree0f1c6e16d69dc5a1b7d1bd1795ec5c15e3f87203
parent071491e89f74a82713766284ffafead30abdc5de (diff)
downloadvala-3c46988e0dbca6c072633de40bc3cd2cd918f2c1.tar.gz
fix spurious error when overriding abstract method in derived abstract
2008-04-07 Juerg Billeter <j@bitron.ch> * 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
-rw-r--r--ChangeLog9
-rw-r--r--tests/classes-methods.vala14
-rw-r--r--vala/valasemanticanalyzer.vala12
3 files changed, 30 insertions, 5 deletions
diff --git a/ChangeLog b/ChangeLog
index 1acf1733a..ad16e8b89 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,14 @@
2008-04-07 Jürg Billeter <j@bitron.ch>
+ * 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 <j@bitron.ch>
+
* vala/valasemanticanalyzer.vala: check accessiblity of property
types, fixes bug 512404
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 ()));
}
}
}