mirror of
https://github.com/apple/swift.git
synced 2025-12-21 12:14:44 +01:00
The rule changes are as follows: * All functions (introduced with the 'func' keyword) have argument labels for arguments beyond the first, by default. Methods are no longer special in this regard. * The presence of a default argument no longer implies an argument label. The actual changes to the parser and printer are fairly simple; the rest of the noise is updating the standard library, overlays, tests, etc. With the standard library, this change is intended to be API neutral: I've added/removed #'s and _'s as appropriate to keep the user interface the same. If we want to separately consider using argument labels for more free functions now that the defaults in the language have shifted, we can tackle that separately. Fixes rdar://problem/17218256. Swift SVN r27704
306 lines
7.3 KiB
Swift
306 lines
7.3 KiB
Swift
// RUN: %target-parse-verify-swift
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
// Tests for various simple enum constructs
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
|
|
public enum unionSearchFlags {
|
|
case None
|
|
case Backwards
|
|
case Anchored
|
|
|
|
init() { self = .None }
|
|
}
|
|
|
|
func test1() -> unionSearchFlags {
|
|
var a : unionSearchFlags
|
|
var b = unionSearchFlags.None
|
|
b = unionSearchFlags.Anchored
|
|
|
|
return unionSearchFlags.Backwards
|
|
}
|
|
|
|
func test1a() -> unionSearchFlags {
|
|
var a : unionSearchFlags
|
|
var b : unionSearchFlags = .None
|
|
b = .Anchored
|
|
|
|
// ForwardIndexType use of MaybeInt.
|
|
var c = MaybeInt.None
|
|
|
|
return .Backwards
|
|
}
|
|
|
|
func test1b(b : Bool) {
|
|
var x = 123
|
|
.description == 1 // expected-error{{could not find member 'description'}}
|
|
}
|
|
|
|
enum MaybeInt {
|
|
case None
|
|
case Some(Int)
|
|
|
|
init(_ i: Int) { self = MaybeInt.Some(i) }
|
|
}
|
|
|
|
func test2(a: Int, _ b: Int, _ c: MaybeInt) {
|
|
var c = MaybeInt.Some(4)
|
|
var d = MaybeInt.Some // expected-error{{partial application of enum constructor is not allowed}}
|
|
var e = MaybeInt.Some(b)
|
|
|
|
test2(1, 2, .None)
|
|
}
|
|
|
|
enum ZeroOneTwoThree {
|
|
case Zero
|
|
case One(Int)
|
|
case Two(Int, Int)
|
|
case Three(Int,Int,Int)
|
|
case Unknown(MaybeInt, MaybeInt, MaybeInt)
|
|
|
|
init (_ i: Int) { self = .One(i) }
|
|
init (_ i: Int, _ j: Int, _ k: Int) { self = .Three(i, j, k) }
|
|
init (_ i: MaybeInt, _ j: MaybeInt, _ k: MaybeInt) { self = .Unknown(i, j, k) }
|
|
}
|
|
|
|
func test3(a: ZeroOneTwoThree) {
|
|
var e = ZeroOneTwoThree.Three(1,2,3)
|
|
var f = ZeroOneTwoThree.Unknown(MaybeInt.None, MaybeInt.Some(4),
|
|
MaybeInt.Some(32))
|
|
var f1 = ZeroOneTwoThree(MaybeInt.None, MaybeInt(4), MaybeInt(32))
|
|
|
|
var g : Int =
|
|
ZeroOneTwoThree.Zero // expected-error {{'ZeroOneTwoThree' is not convertible to 'Int'}}
|
|
|
|
test3 ZeroOneTwoThree.Zero // expected-error {{expression resolves to an unused function}} expected-error{{consecutive statements}}
|
|
test3 (ZeroOneTwoThree.Zero)
|
|
test3(ZeroOneTwoThree.Zero)
|
|
test3 // expected-error {{expression resolves to an unused function}}
|
|
(ZeroOneTwoThree.Zero)
|
|
|
|
var h : ZeroOneTwoThree = .One(4)
|
|
|
|
var inf : (Int,Int) -> ZeroOneTwoThree = .Two // expected-error{{'((Int, Int) -> ZeroOneTwoThree).Type' does not have a member named 'Two'}}
|
|
}
|
|
|
|
func test3a(a: ZeroOneTwoThree) {
|
|
var e : ZeroOneTwoThree = (.Three(1, 2, 3))
|
|
var f = ZeroOneTwoThree.Unknown(.None, .Some(4), .Some(32))
|
|
|
|
var g = .None // expected-error {{could not find member 'None'}}
|
|
|
|
// Overload resolution can resolve this to the right constructor.
|
|
var h = ZeroOneTwoThree(1)
|
|
|
|
test3a; // expected-error {{unused function}}
|
|
.Zero // expected-error {{could not find member 'Zero'}}
|
|
test3a // expected-error {{unused function}}
|
|
(.Zero) // expected-error {{could not find member 'Zero'}}
|
|
test3a(.Zero)
|
|
}
|
|
|
|
|
|
struct CGPoint { var x : Int, y : Int }
|
|
typealias OtherPoint = ( x : Int, y : Int)
|
|
|
|
func test4() {
|
|
var a : CGPoint
|
|
// Note: we reject the following because it conflicts with the current
|
|
// "init" hack.
|
|
var b = CGPoint.CGPoint(1, 2) // expected-error {{'CGPoint.Type' does not have a member named 'CGPoint'}}
|
|
var c = CGPoint(x: 2, y : 1) // Using injected name.
|
|
|
|
var e = CGPoint.x // expected-error {{'CGPoint.Type' does not have a member named 'x'}}
|
|
var f = OtherPoint.x // expected-error {{'OtherPoint.Type' does not have a member named 'x'}}
|
|
}
|
|
|
|
|
|
|
|
struct CGSize { var width : Int, height : Int }
|
|
|
|
extension CGSize {
|
|
func area() -> Int {
|
|
return width*self.height
|
|
}
|
|
|
|
func area_wrapper() -> Int {
|
|
return area()
|
|
}
|
|
}
|
|
|
|
struct CGRect {
|
|
var origin : CGPoint,
|
|
size : CGSize
|
|
|
|
func area() -> Int {
|
|
return self.size.area()
|
|
}
|
|
}
|
|
|
|
func area(r: CGRect) -> Int {
|
|
return r.size.area()
|
|
}
|
|
|
|
extension CGRect {
|
|
func search(x: Int) -> CGSize {}
|
|
func bad_search(Int) -> CGSize {}
|
|
}
|
|
|
|
func test5(myorigin: CGPoint) {
|
|
var x1 = CGRect(origin: myorigin, size: CGSize(width: 42, height: 123))
|
|
var x2 = x1
|
|
|
|
4+5
|
|
|
|
// Dot syntax.
|
|
var x3 = x2.origin.x
|
|
var x4 = x1.size.area()
|
|
var x4a = (r : x1.size).r.area()
|
|
var x5 = x1.size.area()
|
|
var x5a = (r : x1.size).r.area()
|
|
|
|
var x5b = x1.area //expected-error{{partial application of struct method is not allowed}}
|
|
|
|
var x6 = x1.search(42)
|
|
var x7 = x1.search(42).width
|
|
|
|
// TODO: something like this (name binding on the LHS):
|
|
// var (CGSize(width, height)) = CGSize(1,2)
|
|
|
|
// TODO: something like this, how do we get it in scope in the {} block?
|
|
//if (var Some(x) = somemaybeint) { ... }
|
|
|
|
|
|
}
|
|
|
|
struct StructTest1 {
|
|
var a : Int, c, b : Int
|
|
|
|
|
|
typealias ElementType = Int
|
|
}
|
|
|
|
enum UnionTest1 {
|
|
case x
|
|
case y(Int)
|
|
|
|
func foo() {}
|
|
|
|
init() { self = .x }
|
|
}
|
|
|
|
|
|
extension UnionTest1 {
|
|
func food() {}
|
|
func bar() {}
|
|
|
|
// Type method.
|
|
static func baz() {}
|
|
}
|
|
|
|
struct EmptyStruct {
|
|
func foo() {}
|
|
}
|
|
|
|
func f() {
|
|
var a : UnionTest1
|
|
a.bar()
|
|
UnionTest1.baz() // dot syntax access to a static method.
|
|
|
|
// Test that we can get the "address of a member".
|
|
var member_ptr_static : () -> () = UnionTest1.baz
|
|
var member_ptr : (UnionTest1) -> () -> () = UnionTest1.bar
|
|
}
|
|
|
|
func union_error(a: ZeroOneTwoThree) {
|
|
var t1 : ZeroOneTwoThree = .Zero(1) // expected-error {{'(IntegerLiteralConvertible) -> _' is not identical to 'ZeroOneTwoThree'}}
|
|
var t2 : ZeroOneTwoThree = .One // expected-error {{could not find member 'One'}}
|
|
var t3 : ZeroOneTwoThree = .foo // expected-error {{'ZeroOneTwoThree.Type' does not have a member named 'foo'}}
|
|
var t4 : ZeroOneTwoThree = .foo() // expected-error {{'ZeroOneTwoThree.Type' does not have a member named 'foo'}}
|
|
}
|
|
|
|
func local_struct() {
|
|
struct s { func y() {} }
|
|
}
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
// A silly units example showing "user defined literals".
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
struct distance { var v : Int }
|
|
|
|
func - (lhs: distance, rhs: distance) -> distance {}
|
|
|
|
extension Int {
|
|
func km() -> distance {}
|
|
func cm() -> distance {}
|
|
}
|
|
|
|
func units(x: Int) -> distance {
|
|
x.km() - 4.cm() - 42.km()
|
|
}
|
|
|
|
|
|
|
|
var %% : distance -> distance // expected-error {{expected pattern}} \
|
|
// expected-error {{unary operator cannot be separated from its operand}}
|
|
|
|
func badTupleElement() {
|
|
typealias X = (x : Int, y : Int)
|
|
var y = X.y // expected-error{{'X.Type' does not have a member named 'y'}}
|
|
var z = X.z // expected-error{{'X.Type' does not have a member named 'z'}}
|
|
}
|
|
|
|
enum Direction {
|
|
case North(distance: Int)
|
|
case NorthEast(distanceNorth: Int, distanceEast: Int)
|
|
}
|
|
|
|
func testDirection() {
|
|
var dir: Direction = .North(distance: 5)
|
|
dir = .NorthEast(distanceNorth: 5, distanceEast: 7)
|
|
|
|
var i: Int
|
|
switch dir {
|
|
case .North(let x):
|
|
i = x
|
|
break;
|
|
|
|
case .NorthEast(let x):
|
|
i = x.distanceEast
|
|
break;
|
|
}
|
|
}
|
|
|
|
enum NestedSingleElementTuple {
|
|
case Case(x: (y: Int)) // expected-error{{cannot create a single-element tuple with an element label}}
|
|
}
|
|
|
|
// <rdar://problem/17186190>
|
|
class OuterNonGenericClass {
|
|
enum Bar {
|
|
case Baz
|
|
case Zab
|
|
}
|
|
}
|
|
class OuterGenericClass<T> {
|
|
enum Bar { // expected-error {{type 'Bar' nested in generic type 'OuterGenericClass' is not allowed}}
|
|
case Baz
|
|
case Zab
|
|
}
|
|
}
|
|
|
|
enum SimpleEnum {
|
|
case X, Y
|
|
}
|
|
|
|
func testSimpleEnum() {
|
|
let a : SimpleEnum = .X
|
|
let b : SimpleEnum = (.X)
|
|
let c : SimpleEnum=.X // expected-error {{postfix '=' is reserved}}
|
|
}
|
|
|
|
|
|
|