diff options
author | Adriaan Moors <adriaan.moors@epfl.ch> | 2010-10-12 14:24:59 +0000 |
---|---|---|
committer | Adriaan Moors <adriaan.moors@epfl.ch> | 2010-10-12 14:24:59 +0000 |
commit | 44d0bb2426c23ede04a0f6c5873bdb8567eac5e3 (patch) | |
tree | 04823fbfc62d30e240d8b14596e3d962ba2ce577 | |
parent | b7efe9089062fd3908c07f19ee16a4ec39afdbb8 (diff) | |
download | scala-44d0bb2426c23ede04a0f6c5873bdb8567eac5e3.tar.gz scala-44d0bb2426c23ede04a0f6c5873bdb8567eac5e3.tar.bz2 scala-44d0bb2426c23ede04a0f6c5873bdb8567eac5e3.zip |
closes #3890: propagate inferred type parameter...
closes #3890: propagate inferred type parameters to info of undetermined
type parameters. review by imaier.
-rw-r--r-- | src/compiler/scala/tools/nsc/ast/Trees.scala | 15 | ||||
-rw-r--r-- | src/compiler/scala/tools/nsc/typechecker/Infer.scala | 10 | ||||
-rw-r--r-- | test/files/pos/t3890.scala | 4 |
3 files changed, 28 insertions, 1 deletions
diff --git a/src/compiler/scala/tools/nsc/ast/Trees.scala b/src/compiler/scala/tools/nsc/ast/Trees.scala index 70641f9037..755f798666 100644 --- a/src/compiler/scala/tools/nsc/ast/Trees.scala +++ b/src/compiler/scala/tools/nsc/ast/Trees.scala @@ -961,6 +961,21 @@ trait Trees extends reflect.generic.Trees { self: SymbolTable => lazy val EmptyTreeTypeSubstituter = new TreeTypeSubstituter(List(), List()) + class TreeSymSubstTraverser(val from: List[Symbol], val to: List[Symbol]) extends Traverser { + val subst = new SubstSymMap(from, to) + override def traverse(tree: Tree) { + if (tree.tpe ne null) tree.tpe = subst(tree.tpe) + if (tree.isDef) { + val sym = tree.symbol + val info1 = subst(sym.info) + if (info1 ne sym.info) sym.setInfo(info1) + } + super.traverse(tree) + } + override def apply[T <: Tree](tree: T): T = super.apply(tree.duplicate) + override def toString() = "TreeSymSubstTraverser("+from+","+to+")" + } + /** Substitute symbols in 'from' with symbols in 'to'. Returns a new * tree using the new symbols and whose Ident and Select nodes are * name-consistent with the new symbols. diff --git a/src/compiler/scala/tools/nsc/typechecker/Infer.scala b/src/compiler/scala/tools/nsc/typechecker/Infer.scala index 2313822663..dc143666a1 100644 --- a/src/compiler/scala/tools/nsc/typechecker/Infer.scala +++ b/src/compiler/scala/tools/nsc/typechecker/Infer.scala @@ -1164,7 +1164,15 @@ trait Infer { val treeSubst = new TreeTypeSubstituter(okparams, okargs) treeSubst.traverse(fn) treeSubst.traverseTrees(args) - leftUndet + if(leftUndet nonEmpty) { // #3890 + val leftUndet1 = treeSubst.typeSubst mapOver leftUndet + if(leftUndet ne leftUndet1) { + val symSubst = new TreeSymSubstTraverser(leftUndet, leftUndet1) + symSubst.traverse(fn) + symSubst.traverseTrees(args) + } + leftUndet1 + } else leftUndet } catch { case ex: NoInstance => errorTree(fn, diff --git a/test/files/pos/t3890.scala b/test/files/pos/t3890.scala new file mode 100644 index 0000000000..bfc4754779 --- /dev/null +++ b/test/files/pos/t3890.scala @@ -0,0 +1,4 @@ +object Test { + def g[S, T <: S](s: S)(t: T): Unit = println("") + g("a")("a") // error: inferred type arguments [java.lang.String] do not conform to method g's type parameter bounds [T <: S] +}
\ No newline at end of file |