summaryrefslogtreecommitdiff
path: root/test/files/run/constrained-types.check
blob: c8f0a83ad3651e200fdeec3cfb859a157095f0d2 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
class Annot(obj: Any) extends Annotation with TypeConstraint
defined class Annot

-----
class A {
  val x = "hello"
  val y: Int @Annot(x) = 10
  override def toString = "an A"
} 
defined class A

-----
val a = new A
a: A = an A

-----
val y = a.y   // should rewrite "this.x" to "a.x" 
y: Int @Annot(a.x) = 10

-----
var a2 = new A
a2: A = an A

-----
val y2 = a2.y   // should drop the annotation
y2: Int = 10

-----
object Stuff {
  val x = "hello"
  val y : Int @Annot(x) = 10
}
defined module Stuff

-----
val y = Stuff.y // should rewrite the annotation
y: Int @Annot(Stuff.x) = 10

-----
class B {
  val y: Int @Annot(Stuff.x) = 10
  override def toString = "a B"
}
defined class B

-----
val b = new B
b: B = a B

-----
val y = b.y  // should keep the annotation
y: Int @Annot(Stuff.x) = 10

-----
def m(x: String): String @Annot(x) = x     // m should be annotated with a debruijn
m: (x$0:String)String @Annot(x)

-----
val three = "three"
three: java.lang.String = three

-----
val three2 = m(three:three.type)  // should change x to three
three2: String @Annot(three) = three

-----
var four = "four"
four: java.lang.String = four

-----
val four2 = m(four) // should have an existential bound
four2: String @Annot(x) forSome { val x: java.lang.String } = four

-----
val four3 = four2   // should have the same type as four2
four3: String @Annot(x) forSome { val x: java.lang.String } = four

-----
val stuff = m("stuff") // should not crash
stuff: String @Annot("stuff") = stuff

-----
class peer extends Annotation // should not crash
defined class peer

-----
class NPE[T <: NPE[T] @peer] // should not crash
error: illegal cyclic reference involving class NPE

-----
def m = {
  val x = "three"
  val y : String @Annot(x) = x
  y
} // x should be existentially bound
m: String @Annot(x) forSome { val x: java.lang.String }

-----
def n(y: String) = {
  def m(x: String) : String @Annot(x) = {
    (if (x == "")
      m("default")
    else
      x)
  }
  m("stuff".stripMargin)
} // x should be existentially bound
n: (String)String @Annot(x) forSome { val x: String }

-----
class rep extends Annotation
defined class rep

-----
object A { val x = "hello" : String @ rep }
defined module A

-----
val y = a.x // should drop the annotation
y: java.lang.String = hello

-----
val x = 3 : Int @Annot(e+f+g+h) //should have a graceful error message
<console>:5: error: not found: value e
       val x = 3 : Int @Annot(e+f+g+h) //should have a graceful error message
                              ^

-----
class Where(condition: Boolean) extends Annotation
defined class Where

-----
val x : Int @Where(self > 0 && self < 100) = 3
x: Int @Where(self.>(0).&&(self.<(100))) = 3

-----