diff options
-rw-r--r-- | sources/scala/tools/scalac/typechecker/Analyzer.scala | 3 | ||||
-rw-r--r-- | sources/scalac/ast/TreeGen.java | 6 | ||||
-rwxr-xr-x | test/files/pos/viewtest2.scala | 14 |
3 files changed, 19 insertions, 4 deletions
diff --git a/sources/scala/tools/scalac/typechecker/Analyzer.scala b/sources/scala/tools/scalac/typechecker/Analyzer.scala index e9b45b6c3e..3c0d37861c 100644 --- a/sources/scala/tools/scalac/typechecker/Analyzer.scala +++ b/sources/scala/tools/scalac/typechecker/Analyzer.scala @@ -575,7 +575,7 @@ class Analyzer(global: scalac_Global, descr: AnalyzerPhase) extends Transformer( val vapp = transform( make.Apply(tree.pos, vexpr, NewArray.Tree(tree)), mode, pt); if (v.symtype.isObjectType()) { - val tree1 = transform(tree.duplicate(), mode, pt); + val tree1 = gen.mkAsInstanceOf(tree.duplicate(), vapp.getType()); gen.If( gen.Apply( gen.Select( @@ -1650,7 +1650,6 @@ class Analyzer(global: scalac_Global, descr: AnalyzerPhase) extends Transformer( if (v != null) { qual = applyView( v, qual.setType(qual.getType().singleDeref()), EXPRmode, Type.AnyType); - System.out.println("app view " + qual + ":" + qual.getType());//debug sym = qual.getType().lookup(name); assert(sym.kind != NONE); } else { diff --git a/sources/scalac/ast/TreeGen.java b/sources/scalac/ast/TreeGen.java index 4abd940f9c..405f14d618 100644 --- a/sources/scalac/ast/TreeGen.java +++ b/sources/scalac/ast/TreeGen.java @@ -356,14 +356,16 @@ public class TreeGen implements Kinds, Modifiers, TypeTags { */ public Tree mkApplyTV(int pos, Tree fn, Type[] targs, Tree[] vargs) { if (targs.length != 0) fn = TypeApply(pos, fn, mkTypes(pos, targs)); - return Apply(pos, fn, vargs); + if (vargs.length == 0 && fn.getType().isObjectType()) return fn; + else return Apply(pos, fn, vargs); } public Tree mkApplyTV(Tree fn, Type[] targs, Tree[] vargs) { return mkApplyTV(fn.pos, fn, targs, vargs); } public Tree mkApplyTV(int pos, Tree fn, Tree[] targs, Tree[] vargs) { if (targs.length != 0) fn = TypeApply(pos, fn, targs); - return Apply(pos, fn, vargs); + if (vargs.length == 0 && fn.getType().isObjectType()) return fn; + else return Apply(pos, fn, vargs); } public Tree mkApplyTV(Tree fn, Tree[] targs, Tree[] vargs) { return mkApplyTV(fn.pos, fn, targs, vargs); diff --git a/test/files/pos/viewtest2.scala b/test/files/pos/viewtest2.scala index 880ee2a57a..0d580418d0 100755 --- a/test/files/pos/viewtest2.scala +++ b/test/files/pos/viewtest2.scala @@ -75,6 +75,13 @@ class Node[+a <% Ordered[a]](elem: a, l: Tree[a], r: Tree[a]) extends Tree[a] { l.elements ::: List(elem) ::: r.elements } +case class Str(elem: String) extends Ordered[Str] { + def compareTo[b >: Str <% Ordered[b]](that: b): int = that match { + case that1: Str => this.elem compareTo that1.elem + case _ => -(that compareTo this) + } +} + object Test { import O.view; @@ -91,6 +98,13 @@ object Test { System.out.println(t.elements) } { + var t: Tree[Str] = Empty; + for (val s <- args) { + t = t insert Str(s) + } + System.out.println(t.elements) + } + { var t: Tree[List[char]] = Empty; for (val s <- args) { t = t insert toCharList(s) |