summaryrefslogtreecommitdiff
path: root/src/compiler/scala/tools/nsc/typechecker/Typers.scala
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2006-08-21 17:35:21 +0000
committerMartin Odersky <odersky@gmail.com>2006-08-21 17:35:21 +0000
commitc4bc5bc26afd0356d38374955462dd8aea8782bd (patch)
treebe6dc853810aba7223efca5253649d75b74dd5df /src/compiler/scala/tools/nsc/typechecker/Typers.scala
parent1536b1c67ecff52027a0c24d6791fb978fb88db4 (diff)
downloadscala-c4bc5bc26afd0356d38374955462dd8aea8782bd.tar.gz
scala-c4bc5bc26afd0356d38374955462dd8aea8782bd.tar.bz2
scala-c4bc5bc26afd0356d38374955462dd8aea8782bd.zip
Diffstat (limited to 'src/compiler/scala/tools/nsc/typechecker/Typers.scala')
-rw-r--r--src/compiler/scala/tools/nsc/typechecker/Typers.scala24
1 files changed, 10 insertions, 14 deletions
diff --git a/src/compiler/scala/tools/nsc/typechecker/Typers.scala b/src/compiler/scala/tools/nsc/typechecker/Typers.scala
index c9b75eaf73..c01cbdb689 100644
--- a/src/compiler/scala/tools/nsc/typechecker/Typers.scala
+++ b/src/compiler/scala/tools/nsc/typechecker/Typers.scala
@@ -984,8 +984,15 @@ trait Typers requires Analyzer {
def typedRefinement(stats: List[Tree]): List[Tree] = {
namer.enterSyms(stats)
- for (val stat <- stats) stat.symbol setFlag OVERRIDE
- typedStats(stats, NoSymbol)
+ val stats1 = typedStats(stats, NoSymbol)
+ for (val stat <- stats1; stat.isDef) {
+ val member = stat.symbol
+ member setFlag OVERRIDE
+ if (context.owner.info.baseClasses.tail forall
+ (bc => member.matchingSymbol(bc, context.owner.thisType) == NoSymbol))
+ error(member.pos, member.toString+" does not refine a member of its base type")
+ }
+ stats1
}
def typedStats(stats: List[Tree], exprOwner: Symbol): List[Tree] = {
@@ -1002,18 +1009,7 @@ trait Typers requires Analyzer {
case _ =>
val localTyper = if (inBlock || (stat.isDef && !stat.isInstanceOf[LabelDef])) this
else newTyper(context.make(stat, exprOwner))
- val stat1 = localTyper.typed(stat)
- val member = stat1.symbol
- // Check that every defined member with an `override' modifier
- // overrides some other member
- if (stat1.isDef &&
- (member hasFlag(OVERRIDE | ABSOVERRIDE)) &&
- (context.owner.info.baseClasses.tail forall
- (bc => member.matchingSymbol(bc, context.owner.thisType) == NoSymbol))) {
- error(member.pos, member.toString+" overrides nothing")
- member resetFlag OVERRIDE
- }
- stat1
+ localTyper.typed(stat)
}
}
val scope = if (inBlock) context.scope else context.owner.info.decls;