summaryrefslogtreecommitdiff
path: root/sources/scalac/typechecker
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2004-04-06 17:57:30 +0000
committerMartin Odersky <odersky@gmail.com>2004-04-06 17:57:30 +0000
commit35f72d0a599e3aca2940e295052c0275c0a32533 (patch)
tree86c40542dc2a3412b4a0fcb76a71c1e1141522bf /sources/scalac/typechecker
parent17c857d22ec405ec89e87e40206aecc2be84255d (diff)
downloadscala-35f72d0a599e3aca2940e295052c0275c0a32533.tar.gz
scala-35f72d0a599e3aca2940e295052c0275c0a32533.tar.bz2
scala-35f72d0a599e3aca2940e295052c0275c0a32533.zip
*** empty log message ***
Diffstat (limited to 'sources/scalac/typechecker')
-rw-r--r--sources/scalac/typechecker/RefCheck.java39
1 files changed, 26 insertions, 13 deletions
diff --git a/sources/scalac/typechecker/RefCheck.java b/sources/scalac/typechecker/RefCheck.java
index c7e2572d72..2bb96cbe69 100644
--- a/sources/scalac/typechecker/RefCheck.java
+++ b/sources/scalac/typechecker/RefCheck.java
@@ -58,6 +58,8 @@ public class RefCheck extends Transformer implements Modifiers, Kinds {
// Override checking ------------------------------------------------------------
+ static final int HIBOUND = 0, LOBOUND = 1, VUBOUND = 2;
+
static boolean isIncomplete(Symbol sym) {
return sym.isDeferred() ||
sym.isAbstractOverride() &&
@@ -255,15 +257,17 @@ public class RefCheck extends Transformer implements Modifiers, Kinds {
if (other.typeParams().length != 0)
overrideError(pos, member, other, "may not override parameterized type");
if (!self.memberType(member).isSameAs(self.memberType(other)))
- overrideTypeError(pos, member, other, self, false);
+ overrideTypeError(pos, member, other, self, HIBOUND);
break;
case TYPE:
if (member.typeParams().length != 0)
overrideError(pos, member, other, "may not be parameterized");
if (!self.memberInfo(member).isSubType(self.memberInfo(other)))
- overrideTypeError(pos, member, other, self, false);
+ overrideTypeError(pos, member, other, self, HIBOUND);
if (!self.memberLoBound(other).isSubType(self.memberLoBound(member)))
- overrideTypeError(pos, member, other, self, true);
+ overrideTypeError(pos, member, other, self, LOBOUND);
+ if (!self.memberVuBound(member).isSubType(self.memberVuBound(other)))
+ overrideTypeError(pos, member, other, self, VUBOUND);
break;
default:
if (other.isConstructor())
@@ -271,7 +275,7 @@ public class RefCheck extends Transformer implements Modifiers, Kinds {
"cannot override a class constructor");
if (!normalizedInfo(self, member).isSubType(
normalizedInfo(self, other)))
- overrideTypeError(pos, member, other, self, false);
+ overrideTypeError(pos, member, other, self, HIBOUND);
}
}
}
@@ -284,17 +288,25 @@ public class RefCheck extends Transformer implements Modifiers, Kinds {
}
void overrideTypeError(int pos, Symbol member, Symbol other, Type site,
- boolean lobound) {
+ int boundkind) {
if (!other.type().isError() && !member.type().isError()) {
- Type memberInfo = lobound ? site.memberLoBound(member)
- : normalizedInfo(site, member);
- Type otherInfo = lobound ? site.memberLoBound(other)
- : normalizedInfo(site, other);
+ Type memberInfo;
+ Type otherInfo;
+ if (boundkind == LOBOUND) {
+ memberInfo = site.memberLoBound(member);
+ otherInfo = site.memberLoBound(other);
+ } else if (boundkind == VUBOUND) {
+ memberInfo = site.memberVuBound(member);
+ otherInfo = site.memberVuBound(other);
+ } else {
+ memberInfo = normalizedInfo(site, member);
+ otherInfo = normalizedInfo(site, other);
+ }
unit.error(pos,
member + member.locationString() +
- infoString(member, memberInfo, lobound) +
+ infoString(member, memberInfo, boundkind) +
"\n cannot override " + other + other.locationString() +
- infoString(other, otherInfo, lobound));
+ infoString(other, otherInfo, boundkind));
Type.explainTypes(memberInfo, otherInfo);
}
}
@@ -303,10 +315,10 @@ public class RefCheck extends Transformer implements Modifiers, Kinds {
return site.memberInfo(sym).derefDef();
}
- String infoString(Symbol sym, Type symtype, boolean lobound) {
+ String infoString(Symbol sym, Type symtype, int boundkind) {
switch (sym.kind) {
case ALIAS: return ", which equals " + symtype;
- case TYPE: return " bounded" + (lobound ? " from below" : "") + " by " + symtype;
+ case TYPE: return " bounded" + (boundkind == LOBOUND ? " from below" : "") + " by " + symtype;
case VAL: return " of type " + symtype;
default: return "";
}
@@ -956,6 +968,7 @@ public class RefCheck extends Transformer implements Modifiers, Kinds {
case AbsTypeDef(_, _, _, _):
validateVariance(sym, sym.info(), CoVariance);
validateVariance(sym, sym.loBound(), ContraVariance);
+ validateVariance(sym, sym.vuBound(), CoVariance);
return super.transform(tree);
case AliasTypeDef(_, _, _, _):