Files
swift-mirror/test/decl/var/static_var.swift
Jordan Rose 1d03915dfc Make sure static vars in protocols don't get mutating setters.
Static members are never mutating, and having them be mutating in protocols
resulted in requirement mismatches.

rdar://problem/19887250

Swift SVN r25593
2015-02-27 04:54:01 +00:00

245 lines
13 KiB
Swift

// RUN: %target-parse-verify-swift -parse-as-library
// See also rdar://15626843.
static var gvu1: Int // expected-error {{static properties may only be declared on a type}}{{1-7=}}
// expected-error@-1 {{global 'var' declaration requires an initializer expression or getter/setter specifier}}
class var gvu2: Int // expected-error {{class properties may only be declared on a type}}{{1-6=}}
// expected-error@-1 {{global 'var' declaration requires an initializer expression or getter/setter specifier}}
override static var gvu3: Int // expected-error {{static properties may only be declared on a type}}{{10-16=}}
// expected-error@-1 {{'override' can only be specified on class members}}{{1-9=}}
// expected-error@-2 {{global 'var' declaration requires an initializer expression or getter/setter specifier}}
override class var gvu4: Int // expected-error {{class properties may only be declared on a type}}{{10-15=}}
// expected-error@-1 {{'override' can only be specified on class members}}{{1-9=}}
// expected-error@-2 {{global 'var' declaration requires an initializer expression or getter/setter specifier}}
static override var gvu5: Int // expected-error {{static properties may only be declared on a type}}{{1-7=}}
// expected-error@-1 {{'override' can only be specified on class members}}{{8-16=}}
// expected-error@-2 {{global 'var' declaration requires an initializer expression or getter/setter specifier}}
class override var gvu6: Int // expected-error {{class properties may only be declared on a type}}{{1-6=}}
// expected-error@-1 {{'override' can only be specified on class members}}{{7-15=}}
// expected-error@-2 {{global 'var' declaration requires an initializer expression or getter/setter specifier}}
static var gvu7: Int { // expected-error {{static properties may only be declared on a type}}{{1-7=}}
return 42
}
class var gvu8: Int { // expected-error {{class properties may only be declared on a type}}{{1-6=}}
return 42
}
static let glu1: Int // expected-error {{static properties may only be declared on a type}}{{1-7=}}
// expected-error@-1 {{global 'let' declaration requires an initializer expression}}
class let glu2: Int // expected-error {{class properties may only be declared on a type}}{{1-6=}}
// expected-error@-1 {{global 'let' declaration requires an initializer expression}}
override static let glu3: Int // expected-error {{static properties may only be declared on a type}}{{10-16=}}
// expected-error@-1 {{'override' can only be specified on class members}}{{1-9=}}
// expected-error@-2 {{global 'let' declaration requires an initializer expression}}
override class let glu4: Int // expected-error {{class properties may only be declared on a type}}{{10-15=}}
// expected-error@-1 {{'override' can only be specified on class members}}{{1-9=}}
// expected-error@-2 {{global 'let' declaration requires an initializer expression}}
static override let glu5: Int // expected-error {{static properties may only be declared on a type}}{{1-7=}}
// expected-error@-1 {{'override' can only be specified on class members}}{{8-16=}}
// expected-error@-2 {{global 'let' declaration requires an initializer expression}}
class override let glu6: Int // expected-error {{class properties may only be declared on a type}}{{1-6=}}
// expected-error@-1 {{'override' can only be specified on class members}}{{7-15=}}
// expected-error@-2 {{global 'let' declaration requires an initializer expression}}
static var gvi1: Int = 0 // expected-error {{static properties may only be declared on a type}}{{1-7=}}
class var gvi2: Int = 0 // expected-error {{class properties may only be declared on a type}}{{1-6=}}
override static var gvi3: Int = 0 // expected-error {{static properties may only be declared on a type}}{{10-16=}}
// expected-error@-1 {{'override' can only be specified on class members}}{{1-9=}}
override class var gvi4: Int = 0 // expected-error {{class properties may only be declared on a type}}{{10-15=}}
// expected-error@-1 {{'override' can only be specified on class members}}{{1-9=}}
static override var gvi5: Int = 0 // expected-error {{static properties may only be declared on a type}}{{1-7=}}
// expected-error@-1 {{'override' can only be specified on class members}}{{8-16=}}
class override var gvi6: Int = 0 // expected-error {{class properties may only be declared on a type}}{{1-6=}}
// expected-error@-1 {{'override' can only be specified on class members}}{{7-15=}}
static let gli1: Int = 0 // expected-error {{static properties may only be declared on a type}}{{1-7=}}
class let gli2: Int = 0 // expected-error {{class properties may only be declared on a type}}{{1-6=}}
override static let gli3: Int = 0 // expected-error {{static properties may only be declared on a type}}{{10-16=}}
// expected-error@-1 {{'override' can only be specified on class members}}{{1-9=}}
override class let gli4: Int = 0 // expected-error {{class properties may only be declared on a type}}{{10-15=}}
// expected-error@-1 {{'override' can only be specified on class members}}{{1-9=}}
static override let gli5: Int = 0 // expected-error {{static properties may only be declared on a type}}{{1-7=}}
// expected-error@-1 {{'override' can only be specified on class members}}{{8-16=}}
class override let gli6: Int = 0 // expected-error {{class properties may only be declared on a type}}{{1-6=}}
// expected-error@-1 {{'override' can only be specified on class members}}{{7-15=}}
func inGlobalFunc() {
static var v1: Int // expected-error {{static properties may only be declared on a type}}{{3-9=}}
class var v2: Int // expected-error {{class properties may only be declared on a type}}{{3-8=}}
static let l1: Int = 0 // expected-error {{static properties may only be declared on a type}}{{3-9=}}
class let l2: Int = 0 // expected-error {{class properties may only be declared on a type}}{{3-8=}}
}
struct InMemberFunc {
func member() {
static var v1: Int // expected-error {{static properties may only be declared on a type}}{{5-11=}}
class var v2: Int // expected-error {{class properties may only be declared on a type}}{{5-10=}}
static let l1: Int = 0 // expected-error {{static properties may only be declared on a type}}{{5-11=}}
class let l2: Int = 0 // expected-error {{class properties may only be declared on a type}}{{5-10=}}
}
}
struct S { // expected-note 3{{extended type declared here}}
static var v1: Int = 0
class var v2: Int = 0 // expected-error {{class properties are only allowed within classes; use 'static' to declare a static property}}
static var v3: Int { return 0 }
class var v4: Int { return 0 } // expected-error {{class properties are only allowed within classes; use 'static' to declare a static property}}
static final var v5 = 1 // expected-error {{only classes and class members may be marked with 'final'}}
static let l1: Int = 0
class let l2: Int = 0 // expected-error {{class properties are only allowed within classes; use 'static' to declare a static property}}
static final let l3 = 1 // expected-error {{only classes and class members may be marked with 'final'}}
}
extension S {
static var ev1: Int = 0
class var ev2: Int = 0 // expected-error {{class properties are only allowed within classes; use 'static' to declare a static property}}
static var ev3: Int { return 0 }
class var ev4: Int { return 0 } // expected-error {{class properties are only allowed within classes; use 'static' to declare a static property}}
static let el1: Int = 0
class let el2: Int = 0 // expected-error {{class properties are only allowed within classes; use 'static' to declare a static property}}
}
enum E { // expected-note 3{{extended type declared here}}
static var v1: Int = 0
class var v2: Int = 0 // expected-error {{class properties are only allowed within classes; use 'static' to declare a static property}}
static var v3: Int { return 0 }
class var v4: Int { return 0 } // expected-error {{class properties are only allowed within classes; use 'static' to declare a static property}}
static final var v5 = 1 // expected-error {{only classes and class members may be marked with 'final'}}
static let l1: Int = 0
class let l2: Int = 0 // expected-error {{class properties are only allowed within classes; use 'static' to declare a static property}}
static final let l3 = 1 // expected-error {{only classes and class members may be marked with 'final'}}
}
extension E {
static var ev1: Int = 0
class var ev2: Int = 0 // expected-error {{class properties are only allowed within classes; use 'static' to declare a static property}}
static var ev3: Int { return 0 }
class var ev4: Int { return 0 } // expected-error {{class properties are only allowed within classes; use 'static' to declare a static property}}
static let el1: Int = 0
class let el2: Int = 0 // expected-error {{class properties are only allowed within classes; use 'static' to declare a static property}}
}
class C {
static var v1: Int = 0
class final var v3: Int = 0 // expected-error {{class stored properties not yet supported}}
class var v4: Int = 0 // expected-error {{class stored properties not yet supported}}
static var v5: Int { return 0 }
class var v6: Int { return 0 }
static final var v7: Int = 0 // expected-error {{static declarations are already final}}
static let l1: Int = 0
class let l2: Int = 0 // expected-error {{class stored properties not yet supported in classes; did you mean 'static'?}}
class final let l3: Int = 0 // expected-error {{class stored properties not yet supported}}
static final let l4 = 2 // expected-error {{static declarations are already final}}
}
extension C {
static var ev1: Int = 0
class final var ev2: Int = 0 // expected-error {{class stored properties not yet supported}}
class var ev3: Int = 0 // expected-error {{class stored properties not yet supported}}
static var ev4: Int { return 0 }
class var ev5: Int { return 0 }
static final var ev6: Int = 0 // expected-error {{static declarations are already final}}
static let el1: Int = 0
class let el2: Int = 0 // expected-error {{class stored properties not yet supported in classes; did you mean 'static'?}}
class final let el3: Int = 0 // expected-error {{class stored properties not yet supported in classes; did you mean 'static'?}}
static final let el4: Int = 0 // expected-error {{static declarations are already final}}
}
protocol P {
// Both `static` and `class` property requirements are equivalent in protocols rdar://problem/17198298
static var v1: Int { get }
class var v2: Int { get } // expected-error {{class properties are only allowed within classes; use 'static' to declare a static property}}
static final var v3: Int { get } // expected-error {{only classes and class members may be marked with 'final'}}
static let l1: Int // expected-error {{static stored properties not yet supported in generic types}} expected-error {{immutable property requirement must be declared as 'var' with a '{ get }' specifier}}
class let l2: Int // expected-error {{class properties are only allowed within classes; use 'static' to declare a static property}} expected-error {{class stored properties not yet supported in generic types}} expected-error {{immutable property requirement must be declared as 'var' with a '{ get }' specifier}}
}
struct S1 {
// rdar://15626843
static var x: Int // expected-error {{'static var' declaration requires an initializer expression or getter/setter specifier}}
var y = 1
static var z = 5
}
extension S1 {
static var zz = 42
static var xy: Int { return 5 }
}
enum E1 {
static var y: Int {
get {}
}
}
class C1 {
class var x: Int // expected-error {{class stored properties not yet supported}} expected-error {{'class var' declaration requires an initializer expression or getter/setter specifier}}
}
class C2 {
var x: Int = 19
class var x: Int = 17 // expected-error{{class stored properties not yet supported}}
func xx() -> Int { return self.x + C2.x }
}
class ClassHasVars {
static var computedStatic: Int { return 0 } // expected-note {{overridden declaration is here}}
class var computedClass: Int { return 0 }
var computedInstance: Int { return 0 }
}
class ClassOverridesVars : ClassHasVars {
override static var computedStatic: Int { return 1 } // expected-error {{class var overrides a 'final' class var}}
override class var computedClass: Int { return 1 }
override var computedInstance: Int { return 1 }
}
struct S2 {
var x: Int = 19
static var x: Int = 17
func xx() -> Int { return self.x + C2.x }
}
// rdar://problem/19887250
protocol Proto {
static var name: String {get set}
}
struct ProtoAdopter : Proto {
static var name: String = "name" // no error, even though static setters aren't mutating
}
// rdar://18990358
public struct Foo {
public static let S { a // expected-error{{computed property must have an explicit type}}
// expected-error@-1{{type annotation missing in pattern}}
// expected-error@-2{{'let' declarations cannot be computed properties}}
// expected-error@-3{{use of unresolved identifier 'a'}}
}
// expected-error@+1 {{expected declaration}}