mirror of
https://github.com/apple/swift.git
synced 2025-12-14 20:36:38 +01:00
Instead of building ArgumentShuffleExprs, lets just build a TupleExpr, with explicit representation of collected varargs and default arguments. This isn't quite as elegant as it should be, because when re-typechecking, SanitizeExpr needs to restore the 'old' parameter list by stripping out the nodes inserted by type checking. However that hackery is all isolated in one place and will go away soon. Note that there's a minor change the generated SIL. Caller default arguments (#file, #line, etc) are no longer delayed and are instead evaluated in their usual argument position. I don't believe this actually results in an observable change in behavior, but if it turns out to be a problem, we can pretty easily change it back to the old behavior with a bit of extra work.
255 lines
5.1 KiB
Swift
255 lines
5.1 KiB
Swift
// RUN: %target-repl-run-simple-swift | %FileCheck %s
|
|
|
|
// REQUIRES: swift_repl
|
|
|
|
:print_decl String
|
|
// CHECK: struct String
|
|
// CHECK: extension String : StringProtocol
|
|
|
|
false // CHECK: Bool = false
|
|
(1,2) // CHECK: (Int, Int) = (1, 2)
|
|
print(10)
|
|
print(10)
|
|
// CHECK: 10
|
|
// CHECK-NEXT: 10
|
|
|
|
func f() {
|
|
print("Hello")
|
|
}
|
|
f() // CHECK: Hello
|
|
|
|
102 // CHECK: Int = 102
|
|
|
|
var x = 1 // CHECK: x : Int = 1
|
|
|
|
(x, 2) // CHECK: (Int, Int) = (1, 2)
|
|
|
|
var (_, y) = (x,2) // CHECK: (_, y) : (Int, Int) = (1, 2)
|
|
|
|
var aString = String() // CHECK: aString : String = ""
|
|
|
|
"\n\r\t\"' abcd\u{45}\u{01}" // CHECK: "\n\r\t\"\' abcdE\u{01}"
|
|
|
|
|
|
String(-1) // CHECK: String = "-1"
|
|
String(-112312312) // CHECK: String = "-112312312"
|
|
String(4.0) // CHECK: String = "4.0"
|
|
|
|
1 +
|
|
44
|
|
// CHECK: Int = 45{{$}}
|
|
|
|
123 .
|
|
hashValue
|
|
// CHECK: Int = {{-?[0-9]+$}}
|
|
|
|
// Check that we handle unmatched parentheses in REPL.
|
|
1+1)
|
|
|
|
var z = 46
|
|
+z
|
|
// CHECK: Int = 46{{$}}
|
|
|
|
+48
|
|
// CHECK: Int = 48{{$}}
|
|
|
|
typealias Foo = Int
|
|
|
|
var f1 : Foo = 1
|
|
var f50 : Foo = 50
|
|
f1 +
|
|
f50
|
|
// CHECK: Foo = 51{{$}}
|
|
+(f50)
|
|
// CHECK: Foo = 50{{$}}
|
|
|
|
1.5
|
|
// CHECK: Double = 1.5{{$}}
|
|
1.5+2.25
|
|
// CHECK: Double = 3.75{{$}}
|
|
+1.75
|
|
// CHECK: Double = 1.75{{$}}
|
|
-1.75
|
|
// CHECK: Double = -1.75{{$}}
|
|
|
|
func r13792487(_ x: Float64) -> Float64 { return x }
|
|
r13792487(1234.0)
|
|
// CHECK: Float64 = 1234.0{{$}}
|
|
r13792487(1234)
|
|
// CHECK: Float64 = 1234.0{{$}}
|
|
|
|
var ab = (1,
|
|
2)
|
|
// CHECK: (Int, Int) = (1, 2)
|
|
|
|
var ba = (y:1, x:2)
|
|
|
|
var f2 : Foo = 2
|
|
var xy = (f1, f2)
|
|
// CHECK: (Foo, Foo) = (1, 2)
|
|
|
|
var yx = (y:f1, x:f2)
|
|
|
|
func sub(x x: Int, y: Int) -> Int { return x - y }
|
|
|
|
sub(x:1, y:2) // CHECK: Int = -1
|
|
sub(x:f1, y:f2) // CHECK: Foo = -1
|
|
|
|
var array = [1, 2, 3, 4, 5]
|
|
// CHECK: array : [Int] = [1, 2, 3, 4, 5]
|
|
|
|
var dict = [ "Hello" : 1.5 ]
|
|
// CHECK: dict : [String : Double] = ["Hello": 1.5]
|
|
|
|
0..<10
|
|
// FIXME: Disabled CHECK for Range<Int> = 0...10 until we get general printing going
|
|
// FIXME: Disabled CHECK for 0...10 pending <rdar://problem/11510876>
|
|
// (Implement overload resolution)
|
|
|
|
// Don't crash on this. rdar://14912363
|
|
-2...-1
|
|
|
|
-2 ... -1
|
|
// r2 : Range<Int> = -2...-1
|
|
|
|
String(0)
|
|
// CHECK: "0"
|
|
|
|
for i in 0..<10 { print(i); }
|
|
// CHECK: 0
|
|
// CHECK-NEXT: 1
|
|
// CHECK-NEXT: 2
|
|
// CHECK-NEXT: 3
|
|
// CHECK-NEXT: 4
|
|
// CHECK-NEXT: 5
|
|
// CHECK-NEXT: 6
|
|
// CHECK-NEXT: 7
|
|
// CHECK-NEXT: 8
|
|
// CHECK-NEXT: 9
|
|
|
|
for i in 0..<10 { print(i); }
|
|
// CHECK: 0
|
|
// CHECK-NEXT: 1
|
|
// CHECK-NEXT: 2
|
|
// CHECK-NEXT: 3
|
|
// CHECK-NEXT: 4
|
|
// CHECK-NEXT: 5
|
|
// CHECK-NEXT: 6
|
|
// CHECK-NEXT: 7
|
|
// CHECK-NEXT: 8
|
|
// CHECK-NEXT: 9
|
|
|
|
for c in "foobar".unicodeScalars { print(c) }
|
|
// CHECK: f
|
|
// CHECK-NEXT: o
|
|
// CHECK-NEXT: o
|
|
// CHECK-NEXT: b
|
|
// CHECK-NEXT: a
|
|
// CHECK-NEXT: r
|
|
|
|
var vec = Array<String>()
|
|
// CHECK: vec : [String] = []
|
|
|
|
// Error recovery
|
|
var a : [int]
|
|
var a = [Int]()
|
|
var b = a.slice[3..<5]
|
|
|
|
struct Inner<T> {}
|
|
struct Outer<T> { var inner : Inner<T> }
|
|
Outer<Int>(inner: Inner()) // CHECK: Outer<Int> = REPL_{{.+}}.Outer
|
|
|
|
struct ContainsSlice { var slice : [Int] }
|
|
ContainsSlice(slice: [1, 2, 3]) // CHECK: ContainsSlice = REPL_{{.+}}.ContainsSlice
|
|
|
|
struct ContainsGenericSlice<T> { var slice : [T] }
|
|
ContainsGenericSlice(slice: [1, 2, 3]) // CHECK: ContainsGenericSlice<Int> = REPL_{{.+}}.ContainsGenericSlice
|
|
ContainsGenericSlice(slice: [(1, 2), (3, 4)]) // CHECK: ContainsGenericSlice<(Int, Int)> = REPL_{{.+}}.ContainsGenericSlice
|
|
|
|
struct ContainsContainsSlice { var containsSlice : ContainsSlice }
|
|
ContainsContainsSlice(containsSlice: ContainsSlice(slice: [1, 2, 3])) // CHECK: ContainsContainsSlice = REPL_{{.+}}.ContainsContainsSlice
|
|
|
|
protocol Proto {
|
|
func foo()
|
|
}
|
|
extension Double : Proto {
|
|
func foo() {
|
|
print("Double: \(self)\n", terminator: "")
|
|
}
|
|
}
|
|
var pr : Proto = 3.14159
|
|
// CHECK: Double: 3.14159
|
|
pr.foo()
|
|
|
|
// erroneous; we'll try again after adding the conformance
|
|
pr = "foo"
|
|
|
|
extension String : Proto {
|
|
func foo() {
|
|
print("String: \(self)\n", terminator: "")
|
|
}
|
|
}
|
|
pr = "foo"
|
|
// CHECK: String: foo
|
|
pr.foo()
|
|
|
|
var _ : ([Int]).Type = type(of: [4])
|
|
// CHECK: : ([Int]).Type
|
|
var _ : ((Int) -> Int)? = .none
|
|
// CHECK: : ((Int) -> Int)?
|
|
func chained(f f: @escaping (Int) -> ()) -> Int { return 0 }
|
|
chained
|
|
// CHECK: : (@escaping (Int) -> ()) -> Int
|
|
[chained]
|
|
// CHECK: : [(@escaping (Int) -> ()) -> Int]
|
|
|
|
({97210}())
|
|
// CHECK: = 97210
|
|
true && true
|
|
// CHECK: = true
|
|
|
|
if ({true}()) { print("yeah1") }
|
|
// CHECK: yeah1
|
|
if true && true { print("yeah2") }
|
|
// CHECK: yeah2
|
|
if true && true { if true && true { print("yeah3") } }
|
|
// CHECK: yeah3
|
|
if true && (true && true) { if true && (true && true) { print("yeah4") } }
|
|
// CHECK: yeah4
|
|
if true && true { if true && true { print(true && true) } }
|
|
// CHECK: true
|
|
|
|
"ok"
|
|
// CHECK: = "ok"
|
|
|
|
// Make sure that class inheritance works
|
|
class A {
|
|
var foo: String { return "" }
|
|
func bar() -> String { return "" }
|
|
subscript(_ x: Int) -> String { return "" }
|
|
}
|
|
|
|
class B : A {
|
|
override var foo: String {
|
|
return "property ok"
|
|
}
|
|
|
|
override init() {}
|
|
|
|
override func bar() -> String {
|
|
return "instance ok"
|
|
}
|
|
|
|
override subscript(_ x: Int) -> String {
|
|
return "subscript ok"
|
|
}
|
|
}
|
|
|
|
let b = B()
|
|
let _ = b.foo
|
|
// CHECK: = "property ok"
|
|
let _ = b.bar()
|
|
// CHECK: = "instance ok"
|
|
let _ = b[42]
|
|
// CHECK: = "subscript ok"
|