From 9feddc6cb4df699472248fc780505a9b437f13a0 Mon Sep 17 00:00:00 2001 From: Martin Odersky Date: Fri, 9 Nov 2007 15:03:13 +0000 Subject: fixed tickets 146,148,155 --- src/compiler/scala/tools/nsc/transform/Erasure.scala | 4 ++-- src/compiler/scala/tools/nsc/transform/OverridingPairs.scala | 3 ++- src/compiler/scala/tools/nsc/typechecker/Typers.scala | 9 +++++++-- 3 files changed, 11 insertions(+), 5 deletions(-) (limited to 'src') diff --git a/src/compiler/scala/tools/nsc/transform/Erasure.scala b/src/compiler/scala/tools/nsc/transform/Erasure.scala index a2575e59ad..02ce42a1a6 100644 --- a/src/compiler/scala/tools/nsc/transform/Erasure.scala +++ b/src/compiler/scala/tools/nsc/transform/Erasure.scala @@ -596,7 +596,7 @@ abstract class Erasure extends AddInterfaces with typechecker.Analyzer { val opc = new overridingPairs.Cursor(root) { override def exclude(sym: Symbol): Boolean = - !sym.isTerm || (sym hasFlag (PRIVATE | BRIDGE)) || super.exclude(sym) + !sym.isTerm || sym.hasFlag(PRIVATE) || super.exclude(sym) override def matches(sym1: Symbol, sym2: Symbol): Boolean = atPhase(phase.next)(sym1.tpe =:= sym2.tpe) } @@ -660,7 +660,7 @@ abstract class Erasure extends AddInterfaces with typechecker.Analyzer { new overridingPairs.Cursor(owner) { override def parents: List[Type] = List(owner.info.parents.head) override def exclude(sym: Symbol): Boolean = - !sym.isMethod || (sym hasFlag (PRIVATE | BRIDGE)) || super.exclude(sym) + !sym.isMethod || sym.hasFlag(PRIVATE) || super.exclude(sym) } } while (opc.hasNext) { diff --git a/src/compiler/scala/tools/nsc/transform/OverridingPairs.scala b/src/compiler/scala/tools/nsc/transform/OverridingPairs.scala index 865d988cae..4217cc32ce 100644 --- a/src/compiler/scala/tools/nsc/transform/OverridingPairs.scala +++ b/src/compiler/scala/tools/nsc/transform/OverridingPairs.scala @@ -24,7 +24,8 @@ abstract class OverridingPairs { private val self = base.thisType - protected def exclude(sym: Symbol): Boolean = sym.isConstructor || sym.isPrivateLocal + protected def exclude(sym: Symbol): Boolean = + sym.isConstructor || sym.isPrivateLocal || sym.hasFlag(BRIDGE) protected def parents: List[Type] = base.info.parents diff --git a/src/compiler/scala/tools/nsc/typechecker/Typers.scala b/src/compiler/scala/tools/nsc/typechecker/Typers.scala index 8cd65792cc..f780293e78 100644 --- a/src/compiler/scala/tools/nsc/typechecker/Typers.scala +++ b/src/compiler/scala/tools/nsc/typechecker/Typers.scala @@ -608,7 +608,7 @@ trait Typers { self: Analyzer => * If all this fails, error */ protected def adapt(tree: Tree, mode: Int, pt: Type): Tree = tree.tpe match { - case ct @ ConstantType(value) if ((mode & TYPEmode) == 0 && (ct <:< pt) && !inIDE) => // (0) + case ct @ ConstantType(value) if ((mode & (TYPEmode | FUNmode)) == 0 && (ct <:< pt) && !inIDE) => // (0) copy.Literal(tree, value) case OverloadedType(pre, alts) if ((mode & FUNmode) == 0) => // (1) inferExprAlternative(tree, pt) @@ -814,7 +814,8 @@ trait Typers { self: Analyzer => */ def adaptToMember(qual: Tree, name: Name, tp: Type): Tree = { val qtpe = qual.tpe.widen - if (qual.isTerm && ((qual.symbol eq null) || !qual.symbol.isTerm || qual.symbol.isValue) && + if (qual.isTerm && + ((qual.symbol eq null) || !qual.symbol.isTerm || qual.symbol.isValue) && phase.id <= currentRun.typerPhase.id && !qtpe.isError && !tp.isError && qtpe.typeSymbol != AllRefClass && qtpe.typeSymbol != AllClass && qtpe != WildcardType) { val coercion = inferView(qual.pos, qtpe, name, tp, true) @@ -1264,6 +1265,10 @@ trait Typers { self: Analyzer => val tparams1 = List.mapConserve(ddef.tparams)(typedTypeDef) val vparamss1 = List.mapConserve(ddef.vparamss)(vparams1 => List.mapConserve(vparams1)(typedValDef)) + for (vparams1 <- vparamss1; if !vparams1.isEmpty; vparam1 <- vparams1.init) { + if (vparam1.symbol.tpe.typeSymbol == RepeatedParamClass) + error(vparam1.pos, "*-parameter must come last") + } var tpt1 = checkNoEscaping.privates(meth, typedType(ddef.tpt)) if (!settings.Xexperimental.value) { for (vparams <- vparamss1; vparam <- vparams) { -- cgit v1.2.3