From 8a69a88c9a72aaf9971fb4feb92b1c25c106ff3d Mon Sep 17 00:00:00 2001 From: Tiark Rompf Date: Mon, 10 Nov 2008 20:31:12 +0000 Subject: fixed #1500 and #1501 --- test/files/run/t1500.check | 3 +++ test/files/run/t1500.scala | 44 +++++++++++++++++++++++++++++++++++++ test/files/run/t1501.check | 3 +++ test/files/run/t1501.scala | 55 ++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 105 insertions(+) create mode 100644 test/files/run/t1500.check create mode 100644 test/files/run/t1500.scala create mode 100644 test/files/run/t1501.check create mode 100644 test/files/run/t1501.scala (limited to 'test') diff --git a/test/files/run/t1500.check b/test/files/run/t1500.check new file mode 100644 index 0000000000..b4e94e95ee --- /dev/null +++ b/test/files/run/t1500.check @@ -0,0 +1,3 @@ +defined class posingAs +resolve: [A,B](A @posingAs[B])B +x: Any = 7 diff --git a/test/files/run/t1500.scala b/test/files/run/t1500.scala new file mode 100644 index 0000000000..a2f4192130 --- /dev/null +++ b/test/files/run/t1500.scala @@ -0,0 +1,44 @@ +import scala.tools.nsc._ + +object Test { + + /** + * Type inference overlooks constraints posed by type parameters in annotations on types. + */ + + val testCode = + + class posingAs[A] extends TypeConstraint + + def resolve[A,B](x: A @posingAs[B]): B = x.asInstanceOf[B] + + val x = resolve(7: @posingAs[Any]) + + .text + + def main(args: Array[String]) = { + + val tool = new Interpreter(new Settings()) + val global = tool.compiler + + import global._ + import definitions._ + + object checker extends AnnotationChecker { + + /** Check annotations to decide whether tpe1 <:< tpe2 */ + def annotationsConform(tpe1: Type, tpe2: Type): Boolean = { + + tpe1.attributes.forall(a1 => tpe2.attributes.forall(a2 => a1.atp <:< a2.atp)) + + } + } + + global.addAnnotationChecker(checker) + + tool.interpret(testCode) + + } + +} + diff --git a/test/files/run/t1501.check b/test/files/run/t1501.check new file mode 100644 index 0000000000..7ec1495292 --- /dev/null +++ b/test/files/run/t1501.check @@ -0,0 +1,3 @@ +defined class xyz +loopWhile: [T](=> Boolean)(=> Unit @xyz[T])Unit @xyz[T] +test: ()Unit @xyz[Int] diff --git a/test/files/run/t1501.scala b/test/files/run/t1501.scala new file mode 100644 index 0000000000..07190a3b2c --- /dev/null +++ b/test/files/run/t1501.scala @@ -0,0 +1,55 @@ +import scala.tools.nsc._ + +object Test { + + /** + * ... + */ + + val testCode = + + class xyz[A] extends TypeConstraint + + def loopWhile[T](cond: =>Boolean)(body: =>(Unit @xyz[T])): Unit @ xyz[T] = {{ + if (cond) {{ + body + loopWhile[T](cond)(body) + }} + }} + + def test() = {{ + var x = 7 + loopWhile(x != 0) {{ + x = x - 1 + (): @xyz[Int] + }} + }} + + .text + + def main(args: Array[String]) = { + + val tool = new Interpreter(new Settings()) + val global = tool.compiler + + import global._ + import definitions._ + + object checker extends AnnotationChecker { + + /** Check annotations to decide whether tpe1 <:< tpe2 */ + def annotationsConform(tpe1: Type, tpe2: Type): Boolean = { + + tpe1.attributes.forall(a1 => tpe2.attributes.forall(a2 => a1.atp <:< a2.atp)) + + } + } + + global.addAnnotationChecker(checker) + + tool.interpret(testCode) + + } + +} + -- cgit v1.2.3