summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAdriaan Moors <adriaan.moors@epfl.ch>2010-10-12 14:24:59 +0000
committerAdriaan Moors <adriaan.moors@epfl.ch>2010-10-12 14:24:59 +0000
commit44d0bb2426c23ede04a0f6c5873bdb8567eac5e3 (patch)
tree04823fbfc62d30e240d8b14596e3d962ba2ce577
parentb7efe9089062fd3908c07f19ee16a4ec39afdbb8 (diff)
downloadscala-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.scala15
-rw-r--r--src/compiler/scala/tools/nsc/typechecker/Infer.scala10
-rw-r--r--test/files/pos/t3890.scala4
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