diff options
author | Martin Odersky <odersky@gmail.com> | 2007-07-27 11:16:24 +0000 |
---|---|---|
committer | Martin Odersky <odersky@gmail.com> | 2007-07-27 11:16:24 +0000 |
commit | 1c87f4dd464b0d46d4cccdcadc90a8362d9598b5 (patch) | |
tree | 990ada7803845e3795bf7e2a0b0b3cfac6a4fcbb /src/compiler/scala/tools/nsc/typechecker/Typers.scala | |
parent | e7ea8f8598cef959a668d191ee0bd65e091eed20 (diff) | |
download | scala-1c87f4dd464b0d46d4cccdcadc90a8362d9598b5.tar.gz scala-1c87f4dd464b0d46d4cccdcadc90a8362d9598b5.tar.bz2 scala-1c87f4dd464b0d46d4cccdcadc90a8362d9598b5.zip |
fixed bugs 1245,1246
Diffstat (limited to 'src/compiler/scala/tools/nsc/typechecker/Typers.scala')
-rw-r--r-- | src/compiler/scala/tools/nsc/typechecker/Typers.scala | 11 |
1 files changed, 11 insertions, 0 deletions
diff --git a/src/compiler/scala/tools/nsc/typechecker/Typers.scala b/src/compiler/scala/tools/nsc/typechecker/Typers.scala index 20797b87b8..37b47325f4 100644 --- a/src/compiler/scala/tools/nsc/typechecker/Typers.scala +++ b/src/compiler/scala/tools/nsc/typechecker/Typers.scala @@ -1182,6 +1182,12 @@ trait Typers { self: Analyzer => } } + private def checkStructuralCondition(refinement: Symbol, vparam: ValDef) { + val tp = vparam.symbol.tpe + if (tp.typeSymbol.isAbstractType && !(tp.typeSymbol.ownerChain contains refinement)) + error(vparam.tpt.pos,"Parameter type in structural refinement may not refer to abstract type defined outside that same refinement") + } + /** * @param ddef ... * @return ... @@ -1218,6 +1224,11 @@ trait Typers { self: Analyzer => phase.id <= currentRun.typerPhase.id && !reporter.hasErrors) computeParamAliases(meth.owner, vparamss1, rhs1) if (tpt1.tpe.typeSymbol != AllClass && !context.returnsSeen) rhs1 = checkDead(rhs1) + + if (meth.owner.isRefinementClass && meth.allOverriddenSymbols.isEmpty) + for (vparams <- ddef.vparamss; vparam <- vparams) + checkStructuralCondition(meth.owner, vparam) + copy.DefDef(ddef, ddef.mods, ddef.name, tparams1, vparamss1, tpt1, rhs1) setType NoType } |