From 261ff3d0abea28091ce951613f440ccaabdfb7b5 Mon Sep 17 00:00:00 2001 From: Martin Odersky Date: Fri, 28 Jul 2006 11:12:16 +0000 Subject: changled handling of gadts --- src/compiler/scala/tools/nsc/ast/TreeGen.scala | 16 +++++-------- .../scala/tools/nsc/transform/Erasure.scala | 14 ++++++++++++ test/files/pos/gadts2.scala | 26 ++++++++++++++++++++++ 3 files changed, 46 insertions(+), 10 deletions(-) create mode 100644 test/files/pos/gadts2.scala 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) +} +} -- cgit v1.2.3