vala r1172 - in trunk: . tests vala
- From: juergbi svn gnome org
- To: svn-commits-list gnome org
- Subject: vala r1172 - in trunk: . tests vala
- Date: Mon, 7 Apr 2008 15:21:50 +0100 (BST)
Author: juergbi
Date: Mon Apr 7 15:21:50 2008
New Revision: 1172
URL: http://svn.gnome.org/viewvc/vala?rev=1172&view=rev
Log:
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
Modified:
trunk/ChangeLog
trunk/tests/classes-methods.vala
trunk/vala/valasemanticanalyzer.vala
Modified: trunk/tests/classes-methods.vala
==============================================================================
--- trunk/tests/classes-methods.vala (original)
+++ trunk/tests/classes-methods.vala Mon Apr 7 15:21:50 2008
@@ -77,3 +77,17 @@
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 {
+}
+
Modified: trunk/vala/valasemanticanalyzer.vala
==============================================================================
--- trunk/vala/valasemanticanalyzer.vala (original)
+++ trunk/vala/valasemanticanalyzer.vala Mon Apr 7 15:21:50 2008
@@ -197,12 +197,14 @@
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 ()));
}
}
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]