summaryrefslogblamecommitdiff
path: root/test/files/run/constrained-types.check
blob: 4acd9d16ae2e74dbb805a88f0d80212c06aa3176 (plain) (tree)
1
2
3
4
5
6
7
8
9
10
 
                                                                                         

                   


                


                                
 

               


                    

           
                                                        

                       
                     

            
                                                    

            


                     


                            
                    
 


                                                       

                           


                




                                 


                    

          
                                                 

                           
                                             
                              
 


                          
                     
 
                                                                    

                                    
                        
                   
 
                                                              
                                                                                                     
                                                        
 
                                                                
                                                                                                     
                                                        
 
                                                 

                                     


                                                                   

                  


                                                       
                 
 


                


                              
                                                           
                                                                                                     
                                             
 


                           







                                         
                                                                                                     
                                                        
 


                                                  

                 


                                                  
                

                                                                              
 


                                                
                 
 


                                                                              
                                       
                                                                              
                               
                                       

                                                                              
                                       

                                                                              
                                       

                                                                              
 
            
scala> class Annot(obj: Any) extends annotation.Annotation with annotation.TypeConstraint
defined class Annot

scala> 

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

scala> 

scala> val a = new A
a: A = an A

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

scala> var a2 = new A
a2: A = an A

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

scala> 

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

scala> 

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

scala> 

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

scala> 

scala> val b = new B
b: B = a B

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

scala> def m(x: String): String @Annot(x) = x
m: (x: String)String @Annot(x)

scala> 

scala> val three = "three"
three: String = three

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

scala> var four = "four"
four: String = four

scala> val four2 = m(four) // should have an existential bound
warning: there was one feature warning; for details, enable `:setting -feature' or `:replay -feature'
four2: String @Annot(x) forSome { val x: String } = four

scala> val four3 = four2   // should have the same type as four2
warning: there was one feature warning; for details, enable `:setting -feature' or `:replay -feature'
four3: String @Annot(x) forSome { val x: String } = four

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

scala> 

scala> class peer extends annotation.Annotation // should not crash
defined class peer

scala> 

scala> class NPE[T <: NPE[T] @peer] // should not crash
defined class NPE

scala> 

scala> def m = {
  val x = "three"
  val y : String @Annot(x) = x
  y
} // x should not escape the local scope with a narrow type
warning: there was one feature warning; for details, enable `:setting -feature' or `:replay -feature'
m: String @Annot(x) forSome { val x: String }

scala> 

scala> 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
warning: there was one feature warning; for details, enable `:setting -feature' or `:replay -feature'
n: (y: String)String @Annot(x) forSome { val x: String }

scala> 

scala> class rep extends annotation.Annotation { }
defined class rep

scala> 

scala> object A { val x = "hello" : String @ rep }
defined object A
warning: previously defined class A is not a companion to object A.
Companions must be defined together; you may wish to use :paste mode for this.

scala> 

scala> val y = a.x // should drop the annotation
y: String = hello

scala> 

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

scala> :quit