summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2012-02-13 14:27:41 +0100
committerMartin Odersky <odersky@gmail.com>2012-02-14 18:33:37 +0100
commitee560229d1be78294b17ba4b0b6f36e8dd68d376 (patch)
treee779b798c86c36d5db5e5b9da01a8f721ec9a780
parent087aee792e20ccf339be1a14349b7fbde647d394 (diff)
downloadscala-ee560229d1be78294b17ba4b0b6f36e8dd68d376.tar.gz
scala-ee560229d1be78294b17ba4b0b6f36e8dd68d376.tar.bz2
scala-ee560229d1be78294b17ba4b0b6f36e8dd68d376.zip
Fixing problems with generation of isInstanceOf, classOf.
-rw-r--r--src/compiler/scala/tools/nsc/transform/Erasure.scala8
-rw-r--r--src/library/scala/reflect/ClassManifest.scala8
-rw-r--r--test/files/run/Meter.scala1
3 files changed, 11 insertions, 6 deletions
diff --git a/src/compiler/scala/tools/nsc/transform/Erasure.scala b/src/compiler/scala/tools/nsc/transform/Erasure.scala
index debf2e4b97..7eb819f058 100644
--- a/src/compiler/scala/tools/nsc/transform/Erasure.scala
+++ b/src/compiler/scala/tools/nsc/transform/Erasure.scala
@@ -583,7 +583,7 @@ abstract class Erasure extends AddInterfaces
case Apply(TypeApply(sel @ Select(qual, name), List(targ)), List())
if tree.symbol == Any_isInstanceOf || tree.symbol == Object_asInstanceOf =>
targ.tpe match {
- case ErasedInlineType(clazz) => targ.setType(scalaErasure(clazz.tpe))
+ case ErasedInlineType(clazz) => targ.setType(clazz.tpe)
case _ =>
}
tree
@@ -1065,7 +1065,11 @@ abstract class Erasure extends AddInterfaces
case Literal(ct) if ct.tag == ClassTag
&& ct.typeValue.typeSymbol != definitions.UnitClass =>
- treeCopy.Literal(tree, Constant(erasure(NoSymbol, ct.typeValue)))
+ val erased = ct.typeValue match {
+ case TypeRef(pre, clazz, args) if clazz.isInlineClass => typeRef(pre, clazz, List())
+ case tpe => erasure(NoSymbol, tpe)
+ }
+ treeCopy.Literal(tree, Constant(erased))
case _ =>
tree
diff --git a/src/library/scala/reflect/ClassManifest.scala b/src/library/scala/reflect/ClassManifest.scala
index 466b57dea7..6342979add 100644
--- a/src/library/scala/reflect/ClassManifest.scala
+++ b/src/library/scala/reflect/ClassManifest.scala
@@ -205,18 +205,18 @@ object ClassManifest {
* pass varargs as arrays into this, we get an infinitely recursive call
* to boxArray. (Besides, having a separate case is more efficient)
*/
- def classType[T <: AnyRef](clazz: jClass[_]): ClassManifest[T] =
+ def classType[T](clazz: jClass[_]): ClassManifest[T] =
new ClassTypeManifest[T](None, clazz, Nil)
/** ClassManifest for the class type `clazz[args]`, where `clazz` is
* a top-level or static class and `args` are its type arguments */
- def classType[T <: AnyRef](clazz: jClass[_], arg1: OptManifest[_], args: OptManifest[_]*): ClassManifest[T] =
+ def classType[T](clazz: jClass[_], arg1: OptManifest[_], args: OptManifest[_]*): ClassManifest[T] =
new ClassTypeManifest[T](None, clazz, arg1 :: args.toList)
/** ClassManifest for the class type `clazz[args]`, where `clazz` is
* a class with non-package prefix type `prefix` and type arguments `args`.
*/
- def classType[T <: AnyRef](prefix: OptManifest[_], clazz: jClass[_], args: OptManifest[_]*): ClassManifest[T] =
+ def classType[T](prefix: OptManifest[_], clazz: jClass[_], args: OptManifest[_]*): ClassManifest[T] =
new ClassTypeManifest[T](Some(prefix), clazz, args.toList)
def arrayType[T](arg: OptManifest[_]): ClassManifest[Array[T]] = arg match {
@@ -249,7 +249,7 @@ object ClassManifest {
/** Manifest for the class type `clazz[args]`, where `clazz` is
* a top-level or static class: todo: we should try to merge this with Manifest's class */
-private class ClassTypeManifest[T <: AnyRef](
+private class ClassTypeManifest[T](
prefix: Option[OptManifest[_]],
val erasure: jClass[_],
override val typeArguments: List[OptManifest[_]]) extends ClassManifest[T]
diff --git a/test/files/run/Meter.scala b/test/files/run/Meter.scala
index e4d9abaa21..0db917aeee 100644
--- a/test/files/run/Meter.scala
+++ b/test/files/run/Meter.scala
@@ -25,6 +25,7 @@ object Test extends App {
println((x + x) / x)
println((x + x) / 0.5)
println((x < x).toString)
+ println("x.isInstanceOf[Meter]: "+x.isInstanceOf[Meter])
println("x.hashCode: "+x.hashCode)