diff options
author | Martin Odersky <odersky@gmail.com> | 2006-08-21 17:35:21 +0000 |
---|---|---|
committer | Martin Odersky <odersky@gmail.com> | 2006-08-21 17:35:21 +0000 |
commit | c4bc5bc26afd0356d38374955462dd8aea8782bd (patch) | |
tree | be6dc853810aba7223efca5253649d75b74dd5df /src/compiler/scala/tools/nsc/typechecker/Typers.scala | |
parent | 1536b1c67ecff52027a0c24d6791fb978fb88db4 (diff) | |
download | scala-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.scala | 24 |
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; |