diff options
-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 |