diff options
author | Lukas Rytz <lukas.rytz@epfl.ch> | 2012-05-10 13:48:32 +0200 |
---|---|---|
committer | Lukas Rytz <lukas.rytz@epfl.ch> | 2012-05-10 13:53:41 +0200 |
commit | 23afe3c9b9ff6f1c9d31cea678909003ca8f943b (patch) | |
tree | 232440a6ded5f3ed38b20e455aee3c301db56f80 /src | |
parent | aa555debf77eeec3a72a1d700f06347d2e489299 (diff) | |
download | scala-23afe3c9b9ff6f1c9d31cea678909003ca8f943b.tar.gz scala-23afe3c9b9ff6f1c9d31cea678909003ca8f943b.tar.bz2 scala-23afe3c9b9ff6f1c9d31cea678909003ca8f943b.zip |
Fix for SI-5654.
More details as code comment and in the bug database.
Diffstat (limited to 'src')
-rw-r--r-- | src/compiler/scala/reflect/internal/transform/Erasure.scala | 9 |
1 files changed, 8 insertions, 1 deletions
diff --git a/src/compiler/scala/reflect/internal/transform/Erasure.scala b/src/compiler/scala/reflect/internal/transform/Erasure.scala index 1b323f839b..5beec70d62 100644 --- a/src/compiler/scala/reflect/internal/transform/Erasure.scala +++ b/src/compiler/scala/reflect/internal/transform/Erasure.scala @@ -17,7 +17,14 @@ trait Erasure { * with primitive as well as class types)?. */ private def genericCore(tp: Type): Type = tp.normalize match { - case TypeRef(_, sym, _) if sym.isAbstractType && !sym.owner.isJavaDefined => + /* A Java Array<T> is erased to Array[Object] (T can only be a reference type), where as a Scala Array[T] is + * erased to Object. However, there is only symbol for the Array class. So to make the distinction between + * a Java and a Scala array, we check if the owner of T comes from a Java class. + * This however caused issue SI-5654. The additional test for EXSITENTIAL fixes it, see the ticket comments. + * In short, members of an existential type (e.g. `T` in `forSome { type T }`) can have pretty arbitrary + * owners (e.g. when computing lubs, <root> is used). All packageClass symbols have `isJavaDefined == true`. + */ + case TypeRef(_, sym, _) if sym.isAbstractType && (!sym.owner.isJavaDefined || sym.hasFlag(Flags.EXISTENTIAL)) => tp case ExistentialType(tparams, restp) => genericCore(restp) |