From 683af5895e3dead6a6dac3c9939a7bcd2c7bad18 Mon Sep 17 00:00:00 2001 From: Paul Phillips Date: Wed, 27 Oct 2010 21:08:48 +0000 Subject: A double goodness whammy involving type inferen... A double goodness whammy involving type inference at the borders. 1) Implicit search preserves singleton type fidelity. 2) Unification of parent bounds is (closer to) correct. Result of 1: "implicit def f(x: Foo.type)" will convert object Foo. Result of 2: "new Trait[Int] { }" may enjoy its type constructor being inferred, no longer foiled by the anonymous class. Also included are some clarity-enhnancing renamings and refactorings. Performance note: I heavily benchmarked the change to isSubArgs and it is reproducibly faster than the previous implementation. Numbers and methodology available upon request. Closes #2693, #3964. Review by moors, who wrote most of this patch but might like to review the comments. --- test/files/pos/bug2693.scala | 6 ++++++ test/files/run/bug3964.check | 2 ++ test/files/run/bug3964.scala | 16 ++++++++++++++++ 3 files changed, 24 insertions(+) create mode 100644 test/files/pos/bug2693.scala create mode 100644 test/files/run/bug3964.check create mode 100644 test/files/run/bug3964.scala (limited to 'test') diff --git a/test/files/pos/bug2693.scala b/test/files/pos/bug2693.scala new file mode 100644 index 0000000000..97732cf081 --- /dev/null +++ b/test/files/pos/bug2693.scala @@ -0,0 +1,6 @@ +class A { + trait T[A] + def usetHk[T[_], A](ta: T[A]) = 0 + usetHk(new T[Int]{}: T[Int]) + usetHk(new T[Int]{}) // fails with: found: java.lang.Object with T[Int], required: ?T[ ?A ] +} \ No newline at end of file diff --git a/test/files/run/bug3964.check b/test/files/run/bug3964.check new file mode 100644 index 0000000000..55569e49e6 --- /dev/null +++ b/test/files/run/bug3964.check @@ -0,0 +1,2 @@ +42 +-21 diff --git a/test/files/run/bug3964.scala b/test/files/run/bug3964.scala new file mode 100644 index 0000000000..df1eb716e8 --- /dev/null +++ b/test/files/run/bug3964.scala @@ -0,0 +1,16 @@ +object Test { + class Base + object Bob extends Base + class Foo { def bippy = 42 } + class Oof { def bippy = -21 } + + // I am more specific than you + implicit def f1(x: Bob.type): Foo = new Foo + implicit def f2(x: Base): Oof = new Oof + + def main(args: Array[String]): Unit = { + // this would of course print an unambiguous 42 + println(Bob.bippy) + println((new Base).bippy) + } +} -- cgit v1.2.3