From 16b00da844c40cc76cee72088bd6dc49fa38d98c Mon Sep 17 00:00:00 2001 From: Martin Odersky Date: Fri, 19 May 2006 13:21:50 +0000 Subject: Fixed bug 601,602,603 --- src/compiler/scala/tools/nsc/symtab/Types.scala | 4 +++- .../scala/tools/nsc/transform/ExplicitOuter.scala | 5 +++-- .../scala/tools/nsc/transform/UnCurry.scala | 21 +++++++++++++-------- .../scala/tools/nsc/typechecker/Infer.scala | 3 +++ 4 files changed, 22 insertions(+), 11 deletions(-) (limited to 'src') diff --git a/src/compiler/scala/tools/nsc/symtab/Types.scala b/src/compiler/scala/tools/nsc/symtab/Types.scala index cc886f6e79..bbc476889b 100644 --- a/src/compiler/scala/tools/nsc/symtab/Types.scala +++ b/src/compiler/scala/tools/nsc/symtab/Types.scala @@ -950,7 +950,9 @@ trait Types requires SymbolTable { case class TypeVar(origin: Type, constr: TypeConstraint) extends Type { override def symbol = origin.symbol override def toString(): String = - if (constr.inst eq NoType) "?" + origin else constr.inst.toString(); + if (constr.inst == null) "" + else if (constr.inst eq NoType) "?" + origin + else constr.inst.toString(); } /** A class representing an as-yet unevaluated type. diff --git a/src/compiler/scala/tools/nsc/transform/ExplicitOuter.scala b/src/compiler/scala/tools/nsc/transform/ExplicitOuter.scala index 4524157ce5..cf90c4dda3 100644 --- a/src/compiler/scala/tools/nsc/transform/ExplicitOuter.scala +++ b/src/compiler/scala/tools/nsc/transform/ExplicitOuter.scala @@ -333,11 +333,12 @@ abstract class ExplicitOuter extends InfoTransform { sym.makeNotPrivate(sym.owner); //(2) tree1 case Select(qual, name) => - if (currentOwner.enclClass != sym.owner) // (3) + val enclClass = currentOwner.enclClass + if (enclClass != sym.owner && enclClass != sym.moduleClass) // (3) sym.makeNotPrivate(sym.owner); if ((sym hasFlag PROTECTED) && //(4) !(qual.isInstanceOf[Super] || - (qual.tpe.widen.symbol isSubClass currentOwner.enclClass))) + (qual.tpe.widen.symbol isSubClass enclClass))) sym setFlag notPROTECTED; tree1 case _ => diff --git a/src/compiler/scala/tools/nsc/transform/UnCurry.scala b/src/compiler/scala/tools/nsc/transform/UnCurry.scala index d2955bf9e5..3a87b7c25c 100644 --- a/src/compiler/scala/tools/nsc/transform/UnCurry.scala +++ b/src/compiler/scala/tools/nsc/transform/UnCurry.scala @@ -73,6 +73,7 @@ abstract class UnCurry extends InfoTransform { private var inPattern = false; private var inConstructorFlag = 0L; private var localTyper: analyzer.Typer = analyzer.newTyper(analyzer.rootContext(unit)); + private var byNameArgs = new HashSet[Tree](16) override def transform(tree: Tree): Tree = try { //debug postTransform(mainTransform(tree)); @@ -86,10 +87,10 @@ abstract class UnCurry extends InfoTransform { * x.apply()? Note that this is not the case if `x' is used as an argument to another * call by name parameter. */ - def isByNameRef(tree: Tree): boolean = ( + def isByNameRef(tree: Tree): boolean = tree.isTerm && tree.hasSymbol && - tree.symbol.tpe.symbol == ByNameParamClass && tree.tpe == tree.symbol.tpe.typeArgs.head - ); + tree.symbol.tpe.symbol == ByNameParamClass && + !byNameArgs.contains(tree) /** Uncurry a type of a tree node. * This function is sensitive to whether or not we are in a pattern -- when in a pattern @@ -266,15 +267,19 @@ abstract class UnCurry extends InfoTransform { } case _ => args } - List.map2(formals, args1) ((formal, arg) => - if (formal.symbol != ByNameParamClass) arg - else if (isByNameRef(arg)) arg setType functionType(List(), arg.tpe) - else { + List.map2(formals, args1) { (formal, arg) => + if (formal.symbol != ByNameParamClass) { + arg + } else if (isByNameRef(arg)) { + byNameArgs.addEntry(arg) + arg setType functionType(List(), arg.tpe) + } else { val fun = localTyper.atOwner(currentOwner).typed( Function(List(), arg) setPos arg.pos).asInstanceOf[Function]; new ChangeOwnerTraverser(currentOwner, fun.symbol).traverse(arg); transformFunction(fun) - }) + } + } } } diff --git a/src/compiler/scala/tools/nsc/typechecker/Infer.scala b/src/compiler/scala/tools/nsc/typechecker/Infer.scala index a2c1da2bd4..4ba14aa147 100644 --- a/src/compiler/scala/tools/nsc/typechecker/Infer.scala +++ b/src/compiler/scala/tools/nsc/typechecker/Infer.scala @@ -96,6 +96,7 @@ trait Infer requires Analyzer { val up = if (variance != CONTRAVARIANT) upper else !upper; tvar.constr.inst = null; val bound: Type = if (up) tparam.info.bounds.hi else tparam.info.bounds.lo; + //Console.println("solveOne0 "+tvar+" "+config+" "+bound);//DEBUG var cyclic = false; for (val Pair(tvar2, Pair(tparam2, variance2)) <- config) { if (tparam2 != tparam && @@ -127,6 +128,8 @@ trait Infer requires Analyzer { tparam2.tpe.subst(tparams, tvars) :: tvar.constr.lobounds; } } + //Console.println("solveOne2 "+tvar+" "+config+" "+tvar.constr.hibounds);//DEBUG + tvar.constr.inst = NoType // necessary because hibounds/lobounds may contain tvar tvar.constr.inst = if (up) glb(tvar.constr.hibounds) else lub(tvar.constr.lobounds) } } -- cgit v1.2.3