summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2006-07-28 11:12:16 +0000
committerMartin Odersky <odersky@gmail.com>2006-07-28 11:12:16 +0000
commit261ff3d0abea28091ce951613f440ccaabdfb7b5 (patch)
tree7fe20dd86c68f011cb3d98851def632ea0cd9db1
parenta3be6043783a91e1035847207831eb1305da78bb (diff)
downloadscala-261ff3d0abea28091ce951613f440ccaabdfb7b5.tar.gz
scala-261ff3d0abea28091ce951613f440ccaabdfb7b5.tar.bz2
scala-261ff3d0abea28091ce951613f440ccaabdfb7b5.zip
changled handling of gadts
-rw-r--r--src/compiler/scala/tools/nsc/ast/TreeGen.scala16
-rw-r--r--src/compiler/scala/tools/nsc/transform/Erasure.scala14
-rw-r--r--test/files/pos/gadts2.scala26
3 files changed, 46 insertions, 10 deletions
diff --git a/src/compiler/scala/tools/nsc/ast/TreeGen.scala b/src/compiler/scala/tools/nsc/ast/TreeGen.scala
index 2f0aa072dc..4ec47829e2 100644
--- a/src/compiler/scala/tools/nsc/ast/TreeGen.scala
+++ b/src/compiler/scala/tools/nsc/ast/TreeGen.scala
@@ -26,16 +26,12 @@ abstract class TreeGen {
if (clazz.isRoot || clazz.isEmptyPackageClass) EmptyTree
else mkAttributedThis(clazz)
case SingleType(pre, sym) =>
- if (sym.isThisSkolem) {
- mkAttributedQualifier(ThisType(sym.deSkolemize))
- } else {
- val qual = mkAttributedStableRef(pre, sym)
- qual.tpe match {
- case MethodType(List(), restpe) =>
- Apply(qual, List()) setType restpe
- case _ =>
- qual
- }
+ val qual = mkAttributedStableRef(pre, sym)
+ qual.tpe match {
+ case MethodType(List(), restpe) =>
+ Apply(qual, List()) setType restpe
+ case _ =>
+ qual
}
case TypeRef(pre, sym, args) =>
assert(phase.erasedTypes)
diff --git a/src/compiler/scala/tools/nsc/transform/Erasure.scala b/src/compiler/scala/tools/nsc/transform/Erasure.scala
index ac5d15a985..c14e9c5c9f 100644
--- a/src/compiler/scala/tools/nsc/transform/Erasure.scala
+++ b/src/compiler/scala/tools/nsc/transform/Erasure.scala
@@ -604,6 +604,20 @@ abstract class Erasure extends AddInterfaces with typechecker.Analyzer {
if (qual.tpe <:< targ.tpe) Typed(qual, TypeTree(qual.tpe))
else tree
}
+ // todo: get rid of instanceOfErased
+ // todo: also handle the case where the singleton type is buried in a compound
+ else if (fn.symbol == Any_isInstanceOf || fn.symbol == Any_isInstanceOfErased)
+ fn match {
+ case TypeApply(Select(qual, _), List(targ)) =>
+ targ.tpe match {
+ case SingleType(pre, sym) =>
+ val cmpOp = if (targ.tpe <:< AnyValClass.tpe) Any_equals else Object_eq
+ Apply(Select(qual, cmpOp), List(gen.mkAttributedQualifier(targ.tpe)))
+ case _ =>
+ tree
+ }
+ case _ => tree
+ }
else tree
case Template(parents, body) =>
diff --git a/test/files/pos/gadts2.scala b/test/files/pos/gadts2.scala
new file mode 100644
index 0000000000..ca905c572a
--- /dev/null
+++ b/test/files/pos/gadts2.scala
@@ -0,0 +1,26 @@
+object Test{
+
+abstract class Number
+case class Int(n: int) extends Number
+case class Double(d: double) extends Number
+
+trait Term[+a]
+case class Cell[a](var x: a) extends Term[a]
+final case class NumTerm(val n: Number) extends Term[Number]
+
+
+def f[a](t:Term[a], c:Cell[a]): unit =
+ t match {
+ case NumTerm(n) => c.x = Double(1.0)
+ }
+
+
+val x:Term[Number] = NumTerm(Int(5))
+
+def main(args: Array[String]): unit = {
+ val cell = Cell[Number](Int(6))
+ Console.println(cell)
+ f[Number](new NumTerm(Int(5)), cell)
+ Console.println(cell)
+}
+}