Files
swift-mirror/test/decl/enumtest.swift
Doug Gregor 793b3326af Implement the new rules for argument label defaults.
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
2015-04-24 19:03:30 +00:00

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}}
}