diff options
author | Martin Odersky <odersky@gmail.com> | 2009-11-23 14:45:44 +0000 |
---|---|---|
committer | Martin Odersky <odersky@gmail.com> | 2009-11-23 14:45:44 +0000 |
commit | 85befd69274d53fb2a4e7b9cdbd8fed8f3171e42 (patch) | |
tree | 63c6509c5f49a49a4d8deb09ad0e81d95550106f | |
parent | 1e890eacbf99e0ac005c0afd256fa86e9d456d84 (diff) | |
download | scala-85befd69274d53fb2a4e7b9cdbd8fed8f3171e42.tar.gz scala-85befd69274d53fb2a4e7b9cdbd8fed8f3171e42.tar.bz2 scala-85befd69274d53fb2a4e7b9cdbd8fed8f3171e42.zip |
Closed #1226. Added new test cases.
-rw-r--r-- | src/compiler/scala/tools/nsc/symtab/Types.scala | 21 | ||||
-rw-r--r-- | src/compiler/scala/tools/nsc/typechecker/SuperAccessors.scala | 14 | ||||
-rw-r--r-- | test/files/neg/t2641.check | 39 | ||||
-rw-r--r-- | test/files/neg/t2641.scala | 31 | ||||
-rw-r--r-- | test/files/pos/depexists.scala | 5 | ||||
-rw-r--r-- | test/files/pos/implicits.scala | 5 | ||||
-rw-r--r-- | test/files/pos/t1226.scala | 8 |
7 files changed, 106 insertions, 17 deletions
diff --git a/src/compiler/scala/tools/nsc/symtab/Types.scala b/src/compiler/scala/tools/nsc/symtab/Types.scala index 78bfdaf446..bbbf4dfdec 100644 --- a/src/compiler/scala/tools/nsc/symtab/Types.scala +++ b/src/compiler/scala/tools/nsc/symtab/Types.scala @@ -2521,16 +2521,19 @@ A type's typeSymbol should never be inspected directly. else { var occurCount = emptySymCount ++ (tparams map (_ -> 0)) val tpe = deAlias(tpe0) - for (t <- tpe) { - t match { - case TypeRef(_, sym, _) => - occurCount get sym match { - case Some(count) => occurCount += (sym -> (count + 1)) - case None => - } - case _ => + def countOccs(tp: Type) = + for (t <- tp) { + t match { + case TypeRef(_, sym, _) => + occurCount get sym match { + case Some(count) => occurCount += (sym -> (count + 1)) + case None => + } + case _ => + } } - } + countOccs(tpe) + for (tparam <- tparams) countOccs(tparam.info) val extrapolate = new TypeMap { variance = 1 diff --git a/src/compiler/scala/tools/nsc/typechecker/SuperAccessors.scala b/src/compiler/scala/tools/nsc/typechecker/SuperAccessors.scala index fe2b1fd7ca..fac10bfd72 100644 --- a/src/compiler/scala/tools/nsc/typechecker/SuperAccessors.scala +++ b/src/compiler/scala/tools/nsc/typechecker/SuperAccessors.scala @@ -27,7 +27,6 @@ abstract class SuperAccessors extends transform.Transform with transform.TypingT // inherits abstract value `global' and class `Phase' from Transform import global._ - import typer.typed /** the following two members override abstract members in Transform */ val phaseName: String = "superaccessors" @@ -38,7 +37,6 @@ abstract class SuperAccessors extends transform.Transform with transform.TypingT class SuperAccTransformer(unit: CompilationUnit) extends TypingTransformer(unit) { private var validCurrentOwner = true private var accDefs: List[(Symbol, ListBuffer[Tree])] = List() - private val typer = analyzer.newTyper(analyzer.rootContext(unit)) private def accDefBuf(clazz: Symbol) = accDefs find (_._1 == clazz) match { case Some((_, buf)) => buf @@ -63,8 +61,8 @@ abstract class SuperAccessors extends transform.Transform with transform.TypingT private def checkPackedConforms(tree: Tree, pt: Type): Tree = { if (tree.tpe exists (_.typeSymbol.isExistentialSkolem)) { - val packed = typer.packedType(tree, NoSymbol) - if (!(packed <:< pt)) typer.infer.typeError(tree.pos, packed, pt) + val packed = localTyper.packedType(tree, NoSymbol) + if (!(packed <:< pt)) localTyper.infer.typeError(tree.pos, packed, pt) } tree } @@ -115,7 +113,7 @@ abstract class SuperAccessors extends transform.Transform with transform.TypingT superAcc.setInfo(superAccTpe.cloneInfo(superAcc)) //println("creating super acc "+superAcc+":"+superAcc.tpe)//DEBUG clazz.info.decls enter superAcc; - accDefBuf(clazz) += typed(DefDef(superAcc, EmptyTree)) + accDefBuf(clazz) += typers(clazz).typed(DefDef(superAcc, EmptyTree)) } atPos(sup.pos) { Select(gen.mkAttributedThis(clazz), superAcc) setType tree.tpe; @@ -175,7 +173,7 @@ abstract class SuperAccessors extends transform.Transform with transform.TypingT case sel @ Select(qual @ This(_), name) => if ((sym hasFlag PARAMACCESSOR) && (sym.alias != NoSymbol)) { - val result = typed { + val result = localTyper.typed { Select( Super(qual.symbol, nme.EMPTY.toTypeName/*qual.symbol.info.parents.head.symbol.name*/) setPos qual.pos, sym.alias) setPos tree.pos @@ -207,7 +205,7 @@ abstract class SuperAccessors extends transform.Transform with transform.TypingT val setter = makeSetter(lhs); if (settings.debug.value) log("Replaced " + tree + " with " + setter); - transform(typed(Apply(setter, List(qual, rhs)))) + transform(localTyper.typed(Apply(setter, List(qual, rhs)))) } else super.transform(tree) @@ -306,7 +304,7 @@ abstract class SuperAccessors extends transform.Transform with transform.TypingT } if (settings.debug.value) log("Replaced " + tree + " with " + res) - if (hasArgs) typer.typedOperator(res) else typer.typed(res) + if (hasArgs) localTyper.typedOperator(res) else localTyper.typed(res) } /** Adapt the given argument in call to protected member. diff --git a/test/files/neg/t2641.check b/test/files/neg/t2641.check new file mode 100644 index 0000000000..70123bfc58 --- /dev/null +++ b/test/files/neg/t2641.check @@ -0,0 +1,39 @@ +t2641.scala:19: error: illegal cyclic reference involving trait ManagedSeq + with TraversableViewLike[A, ManagedSeqStrict[A], ManagedSeq[A]] + ^ +t2641.scala:17: error: illegal inheritance; + self-type ManagedSeq does not conform to ManagedSeqStrict[A]'s selftype ManagedSeqStrict[A] + extends ManagedSeqStrict[A] + ^ +t2641.scala:18: error: illegal inheritance; + self-type ManagedSeq does not conform to scala.collection.TraversableView[A,ManagedSeqStrict[A]]'s selftype scala.collection.TraversableView[A,ManagedSeqStrict[A]] + with TraversableView[A, ManagedSeqStrict[A]] + ^ +t2641.scala:19: error: illegal inheritance; + self-type ManagedSeq does not conform to scala.collection.TraversableViewLike[A,ManagedSeqStrict[A],<error>]'s selftype scala.collection.TraversableViewLike[A,Coll,This] + with TraversableViewLike[A, ManagedSeqStrict[A], ManagedSeq[A]] + ^ +t2641.scala:17: error: illegal inheritance; + self-type ManagedSeq does not conform to ScalaObject's selftype ScalaObject + extends ManagedSeqStrict[A] + ^ +t2641.scala:25: error: something is wrong (wrong class file?): trait ManagedSeq with type parameters [A,Coll] gets applied to arguments [], phase = typer + trait Transformed[+B] extends ManagedSeq[B, Coll] with super.Transformed[B] + ^ +t2641.scala:27: error: something is wrong (wrong class file?): trait ManagedSeq with type parameters [A,Coll] gets applied to arguments [], phase = namer + trait Sliced extends Transformed[A] with super.Sliced { + ^ +t2641.scala:27: error: illegal inheritance; superclass Any + is not a subclass of the superclass ManagedSeqStrict + of the mixin trait Transformed + trait Sliced extends Transformed[A] with super.Sliced { + ^ +t2641.scala:27: error: illegal inheritance; superclass Any + is not a subclass of the superclass Object + of the mixin trait Sliced + trait Sliced extends Transformed[A] with super.Sliced { + ^ +t2641.scala:28: error: value managedIterator is not a member of ManagedSeq + override def managedIterator = self.managedIterator slice (from, until) + ^ +10 errors found diff --git a/test/files/neg/t2641.scala b/test/files/neg/t2641.scala new file mode 100644 index 0000000000..5529035f79 --- /dev/null +++ b/test/files/neg/t2641.scala @@ -0,0 +1,31 @@ +import scala.collection._ +import scala.collection.generic._ +import scala.collection.mutable.Builder + + +abstract class ManagedSeqStrict[+A] + extends Traversable[A] + with GenericTraversableTemplate[A, ManagedSeqStrict] +{ + override def companion: GenericCompanion[ManagedSeqStrict] = null + + override def foreach[U](f: A => U): Unit = + null +} + +trait ManagedSeq[+A, +Coll] + extends ManagedSeqStrict[A] + with TraversableView[A, ManagedSeqStrict[A]] + with TraversableViewLike[A, ManagedSeqStrict[A], ManagedSeq[A]] +{ self => + + override def underlying = throw new Exception("no underlying") + + //trait Transformed[+B] extends ManagedSeq[B] with super.Transformed[B] + trait Transformed[+B] extends ManagedSeq[B, Coll] with super.Transformed[B] + + trait Sliced extends Transformed[A] with super.Sliced { + override def managedIterator = self.managedIterator slice (from, until) + } + +} diff --git a/test/files/pos/depexists.scala b/test/files/pos/depexists.scala new file mode 100644 index 0000000000..d539c844c1 --- /dev/null +++ b/test/files/pos/depexists.scala @@ -0,0 +1,5 @@ +object depexists { + + val c: Cell[(a, b)] forSome { type a <: Number; type b <: (a, a) } = null + val d = c +} diff --git a/test/files/pos/implicits.scala b/test/files/pos/implicits.scala index 485d24101e..4979835e21 100644 --- a/test/files/pos/implicits.scala +++ b/test/files/pos/implicits.scala @@ -50,3 +50,8 @@ object Test2188 { val x: java.util.List[String] = List("foo") } + +object TestNumericWidening { + val y = 1 + val x: java.lang.Long = y +} diff --git a/test/files/pos/t1226.scala b/test/files/pos/t1226.scala new file mode 100644 index 0000000000..0af21cbb61 --- /dev/null +++ b/test/files/pos/t1226.scala @@ -0,0 +1,8 @@ +package graphs; + +abstract class Graph (private[graphs] val mappings : Any){ +} + +class Nodes (mappings : Any) extends Graph(mappings) { + mappings.toString; +} |