diff options
author | Jason Zaugg <jzaugg@gmail.com> | 2013-02-13 17:01:36 +0100 |
---|---|---|
committer | Jason Zaugg <jzaugg@gmail.com> | 2013-02-14 07:51:39 +0100 |
commit | c11cf0b6c55cc2ec15820dceb6ba825726deed88 (patch) | |
tree | 8c8be976b8bb06f85bdad2364d6b62dce6ae9c5d | |
parent | bafebe1c161f8db0be758c30fe5cc51082a56427 (diff) | |
download | scala-c11cf0b6c55cc2ec15820dceb6ba825726deed88.tar.gz scala-c11cf0b6c55cc2ec15820dceb6ba825726deed88.tar.bz2 scala-c11cf0b6c55cc2ec15820dceb6ba825726deed88.zip |
SI-7120 Erasure must honor typeref prefixes
Erasure was discarding these, which led to unnecessarily
wide types in quite particular circumstances. This showed
up as a double definition error in the reported bug when the
bridge method clashed with the erased signature.
-rw-r--r-- | src/reflect/scala/reflect/internal/transform/Erasure.scala | 2 | ||||
-rw-r--r-- | test/files/run/t7120.check | 1 | ||||
-rw-r--r-- | test/files/run/t7120/Base_1.scala | 10 | ||||
-rw-r--r-- | test/files/run/t7120/Derived_2.scala | 9 | ||||
-rw-r--r-- | test/files/run/t7120/Run_3.scala | 3 | ||||
-rw-r--r-- | test/files/run/t7120b.check | 2 | ||||
-rw-r--r-- | test/files/run/t7120b.scala | 27 |
7 files changed, 53 insertions, 1 deletions
diff --git a/src/reflect/scala/reflect/internal/transform/Erasure.scala b/src/reflect/scala/reflect/internal/transform/Erasure.scala index abf380ac44..d83b4d71d9 100644 --- a/src/reflect/scala/reflect/internal/transform/Erasure.scala +++ b/src/reflect/scala/reflect/internal/transform/Erasure.scala @@ -130,7 +130,7 @@ trait Erasure { else if (sym.isRefinementClass) apply(mergeParents(tp.parents)) else if (sym.isDerivedValueClass) eraseDerivedValueClassRef(tref) else if (sym.isClass) eraseNormalClassRef(pre, sym) - else apply(sym.info) // alias type or abstract type + else apply(sym.info asSeenFrom (pre, sym.owner)) // alias type or abstract type case PolyType(tparams, restpe) => apply(restpe) case ExistentialType(tparams, restpe) => diff --git a/test/files/run/t7120.check b/test/files/run/t7120.check new file mode 100644 index 0000000000..45a4fb75db --- /dev/null +++ b/test/files/run/t7120.check @@ -0,0 +1 @@ +8 diff --git a/test/files/run/t7120/Base_1.scala b/test/files/run/t7120/Base_1.scala new file mode 100644 index 0000000000..be07b4f34f --- /dev/null +++ b/test/files/run/t7120/Base_1.scala @@ -0,0 +1,10 @@ +// This bug doesn't depend on separate compilation, +// in the interests of minimizing the log output during +// debugging this problem, I've split the compilation. + +case class Container( v: String ) + +trait Base[ T <: AnyRef ] { + type UserType = T + protected def defect: PartialFunction[ UserType, String ] +} diff --git a/test/files/run/t7120/Derived_2.scala b/test/files/run/t7120/Derived_2.scala new file mode 100644 index 0000000000..e0de629f82 --- /dev/null +++ b/test/files/run/t7120/Derived_2.scala @@ -0,0 +1,9 @@ +trait Derived extends Base[ Container ] { + protected def defect = { case c: Container => c.v.toString } +} + +// Erasure was ignoring the prefix `Derived#7001.this` when erasing +// A1, and consequently used `Object` rather than `Container`, which +// was only seen because that signature clashed with the bridge method. +// +// applyOrElse[A1 <: Derived#7001.this.UserType#7318, B1 >: String](x1: A1) diff --git a/test/files/run/t7120/Run_3.scala b/test/files/run/t7120/Run_3.scala new file mode 100644 index 0000000000..95e7f994ff --- /dev/null +++ b/test/files/run/t7120/Run_3.scala @@ -0,0 +1,3 @@ +object Test extends Derived with App { + println( defect( Container( "8" ) ) ) +} diff --git a/test/files/run/t7120b.check b/test/files/run/t7120b.check new file mode 100644 index 0000000000..aa2f5e7c9f --- /dev/null +++ b/test/files/run/t7120b.check @@ -0,0 +1,2 @@ +public int C$D.foo(java.lang.String) +public int C$D.foo(java.lang.String) diff --git a/test/files/run/t7120b.scala b/test/files/run/t7120b.scala new file mode 100644 index 0000000000..9f6591aa06 --- /dev/null +++ b/test/files/run/t7120b.scala @@ -0,0 +1,27 @@ +trait Base[A] { type B = A; } +class C extends Base[String] { + class D { + def foo[B1 <: B](b: B1) = 0 + } +} + +trait BaseHK[M[_], A] { type B = M[A]; } +object BaseHK { type Id[X] = X } +class CHK extends BaseHK[BaseHK.Id, String] { + class D { + def foo[B1 <: B](b: B1) = 0 + } +} + + +object Test extends App { + val c = new C + val d = new c.D() + val meth = d.getClass.getMethods.find(_.getName == "foo").get + println(meth) + + val chk = new CHK + val dhk = new chk.D() + val methhk = d.getClass.getMethods.find(_.getName == "foo").get + println(methhk) +} |