mirror of
https://github.com/apple/swift.git
synced 2025-12-14 20:36:38 +01:00
Tweaked usable check:
* Local type/func decls are usable even before declaration
* Outer nominal Instance member are not usable
* Type context cannot close over values in outer type contexts
Added shadowing rule by the base name:
* Type members don't shadow each other as long as they are in the
same type context.
* Local values shadow everything in outer scope
* Except that 'func' decl doesn't shadow 'var' decl if they are in the
same scope.
rdar://86285396
297 lines
17 KiB
Swift
297 lines
17 KiB
Swift
// RUN: %target-typecheck-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-8=}}
|
|
// expected-error@-1 {{global 'var' declaration requires an initializer expression or an explicitly stated getter}}
|
|
// expected-note@-2 {{add an initializer to silence this error}} {{18-18= = <#initializer#>}}
|
|
class var gvu2: Int // expected-error {{class properties may only be declared on a type}}{{1-7=}}
|
|
// expected-error@-1 {{global 'var' declaration requires an initializer expression or an explicitly stated getter}}
|
|
// expected-note@-2 {{add an initializer to silence this error}} {{17-17= = <#initializer#>}}
|
|
override static var gvu3: Int // expected-error {{static properties may only be declared on a type}}{{10-17=}}
|
|
// expected-error@-1 {{'override' can only be specified on class members}}{{1-10=}}
|
|
// expected-error@-2 {{global 'var' declaration requires an initializer expression or an explicitly stated getter}}
|
|
// expected-note@-3 {{add an initializer to silence this error}} {{27-27= = <#initializer#>}}
|
|
override class var gvu4: Int // expected-error {{class properties may only be declared on a type}}{{10-16=}}
|
|
// expected-error@-1 {{'override' can only be specified on class members}}{{1-10=}}
|
|
// expected-error@-2 {{global 'var' declaration requires an initializer expression or an explicitly stated getter}}
|
|
// expected-note@-3 {{add an initializer to silence this error}} {{26-26= = <#initializer#>}}
|
|
static override var gvu5: Int // expected-error {{static properties may only be declared on a type}}{{1-8=}}
|
|
// expected-error@-1 {{'override' can only be specified on class members}}{{8-17=}}
|
|
// expected-error@-2 {{global 'var' declaration requires an initializer expression or an explicitly stated getter}}
|
|
// expected-note@-3 {{add an initializer to silence this error}} {{27-27= = <#initializer#>}}
|
|
class override var gvu6: Int // expected-error {{class properties may only be declared on a type}}{{1-7=}}
|
|
// expected-error@-1 {{'override' can only be specified on class members}}{{7-16=}}
|
|
// expected-error@-2 {{global 'var' declaration requires an initializer expression or an explicitly stated getter}}
|
|
// expected-note@-3 {{add an initializer to silence this error}} {{26-26= = <#initializer#>}}
|
|
|
|
static var gvu7: Int { // expected-error {{static properties may only be declared on a type}}{{1-8=}}
|
|
return 42
|
|
}
|
|
class var gvu8: Int { // expected-error {{class properties may only be declared on a type}}{{1-7=}}
|
|
return 42
|
|
}
|
|
|
|
|
|
static let glu1: Int // expected-error {{static properties may only be declared on a type}}{{1-8=}}
|
|
// expected-error@-1 {{global 'let' declaration requires an initializer expression}}
|
|
// expected-note@-2 {{add an initializer to silence this error}} {{18-18= = <#initializer#>}}
|
|
class let glu2: Int // expected-error {{class properties may only be declared on a type}}{{1-7=}}
|
|
// expected-error@-1 {{global 'let' declaration requires an initializer expression}}
|
|
// expected-note@-2 {{add an initializer to silence this error}} {{17-17= = <#initializer#>}}
|
|
override static let glu3: Int // expected-error {{static properties may only be declared on a type}}{{10-17=}}
|
|
// expected-error@-1 {{'override' can only be specified on class members}}{{1-10=}}
|
|
// expected-error@-2 {{global 'let' declaration requires an initializer expression}}
|
|
// expected-note@-3 {{add an initializer to silence this error}} {{27-27= = <#initializer#>}}
|
|
override class let glu4: Int // expected-error {{class properties may only be declared on a type}}{{10-16=}}
|
|
// expected-error@-1 {{'override' can only be specified on class members}}{{1-10=}}
|
|
// expected-error@-2 {{global 'let' declaration requires an initializer expression}}
|
|
// expected-note@-3 {{add an initializer to silence this error}} {{26-26= = <#initializer#>}}
|
|
static override let glu5: Int // expected-error {{static properties may only be declared on a type}}{{1-8=}}
|
|
// expected-error@-1 {{'override' can only be specified on class members}}{{8-17=}}
|
|
// expected-error@-2 {{global 'let' declaration requires an initializer expression}}
|
|
// expected-note@-3 {{add an initializer to silence this error}} {{27-27= = <#initializer#>}}
|
|
class override let glu6: Int // expected-error {{class properties may only be declared on a type}}{{1-7=}}
|
|
// expected-error@-1 {{'override' can only be specified on class members}}{{7-16=}}
|
|
// expected-error@-2 {{global 'let' declaration requires an initializer expression}}
|
|
// expected-note@-3 {{add an initializer to silence this error}} {{26-26= = <#initializer#>}}
|
|
|
|
|
|
static var gvi1: Int = 0 // expected-error {{static properties may only be declared on a type}}{{1-8=}}
|
|
class var gvi2: Int = 0 // expected-error {{class properties may only be declared on a type}}{{1-7=}}
|
|
override static var gvi3: Int = 0 // expected-error {{static properties may only be declared on a type}}{{10-17=}}
|
|
// expected-error@-1 {{'override' can only be specified on class members}}{{1-10=}}
|
|
override class var gvi4: Int = 0 // expected-error {{class properties may only be declared on a type}}{{10-16=}}
|
|
// expected-error@-1 {{'override' can only be specified on class members}}{{1-10=}}
|
|
static override var gvi5: Int = 0 // expected-error {{static properties may only be declared on a type}}{{1-8=}}
|
|
// expected-error@-1 {{'override' can only be specified on class members}}{{8-17=}}
|
|
class override var gvi6: Int = 0 // expected-error {{class properties may only be declared on a type}}{{1-7=}}
|
|
// expected-error@-1 {{'override' can only be specified on class members}}{{7-16=}}
|
|
|
|
|
|
static let gli1: Int = 0 // expected-error {{static properties may only be declared on a type}}{{1-8=}}
|
|
class let gli2: Int = 0 // expected-error {{class properties may only be declared on a type}}{{1-7=}}
|
|
override static let gli3: Int = 0 // expected-error {{static properties may only be declared on a type}}{{10-17=}}
|
|
// expected-error@-1 {{'override' can only be specified on class members}}{{1-10=}}
|
|
override class let gli4: Int = 0 // expected-error {{class properties may only be declared on a type}}{{10-16=}}
|
|
// expected-error@-1 {{'override' can only be specified on class members}}{{1-10=}}
|
|
static override let gli5: Int = 0 // expected-error {{static properties may only be declared on a type}}{{1-8=}}
|
|
// expected-error@-1 {{'override' can only be specified on class members}}{{8-17=}}
|
|
class override let gli6: Int = 0 // expected-error {{class properties may only be declared on a type}}{{1-7=}}
|
|
// expected-error@-1 {{'override' can only be specified on class members}}{{7-16=}}
|
|
|
|
|
|
func inGlobalFunc() {
|
|
static var v1: Int // expected-error {{static properties may only be declared on a type}}{{3-10=}}
|
|
class var v2: Int // expected-error {{class properties may only be declared on a type}}{{3-9=}}
|
|
|
|
static let l1: Int = 0 // expected-error {{static properties may only be declared on a type}}{{3-10=}}
|
|
class let l2: Int = 0 // expected-error {{class properties may only be declared on a type}}{{3-9=}}
|
|
|
|
v1 = 1; v2 = 1
|
|
_ = v1+v2+l1+l2
|
|
}
|
|
|
|
struct InMemberFunc {
|
|
func member() {
|
|
static var v1: Int // expected-error {{static properties may only be declared on a type}}{{5-12=}}
|
|
class var v2: Int // expected-error {{class properties may only be declared on a type}}{{5-11=}}
|
|
|
|
static let l1: Int = 0 // expected-error {{static properties may only be declared on a type}}{{5-12=}}
|
|
class let l2: Int = 0 // expected-error {{class properties may only be declared on a type}}{{5-11=}}
|
|
|
|
v1 = 1; v2 = 1
|
|
_ = v1+v2+l1+l2
|
|
}
|
|
}
|
|
|
|
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}} {{3-8=static}}
|
|
|
|
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}} {{3-8=static}}
|
|
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}} {{3-8=static}}
|
|
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}} {{3-8=static}}
|
|
|
|
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}} {{3-8=static}}
|
|
|
|
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}} {{3-8=static}}
|
|
}
|
|
|
|
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}} {{3-8=static}}
|
|
|
|
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}} {{3-8=static}}
|
|
|
|
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}} {{3-8=static}}
|
|
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}} {{3-8=static}}
|
|
|
|
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}} {{3-8=static}}
|
|
|
|
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}} {{3-8=static}}
|
|
}
|
|
|
|
class C {
|
|
static var v1: Int = 0
|
|
class final var v3: Int = 0 // expected-error {{class stored properties not supported}}
|
|
class var v4: Int = 0 // expected-error {{class stored properties not 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}} {{10-16=}}
|
|
|
|
static let l1: Int = 0
|
|
class let l2: Int = 0 // expected-error {{class stored properties not supported in classes; did you mean 'static'?}}
|
|
class final let l3: Int = 0 // expected-error {{class stored properties not supported}}
|
|
static final let l4 = 2 // expected-error {{static declarations are already final}} {{10-16=}}
|
|
}
|
|
|
|
extension C {
|
|
static var ev1: Int = 0
|
|
class final var ev2: Int = 0 // expected-error {{class stored properties not supported}}
|
|
class var ev3: Int = 0 // expected-error {{class stored properties not 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}} {{10-16=}}
|
|
|
|
static let el1: Int = 0
|
|
class let el2: Int = 0 // expected-error {{class stored properties not supported in classes; did you mean 'static'?}}
|
|
class final let el3: Int = 0 // expected-error {{class stored properties not supported in classes; did you mean 'static'?}}
|
|
static final let el4: Int = 0 // expected-error {{static declarations are already final}} {{10-16=}}
|
|
}
|
|
|
|
protocol P { // expected-note{{extended type declared here}}
|
|
// 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 requirement fulfilled by either a static or class property}} {{3-8=static}}
|
|
static final var v3: Int { get } // expected-error {{only classes and class members may be marked with 'final'}}
|
|
|
|
static let l1: Int // expected-error {{protocols cannot require properties to be immutable; declare read-only properties by using 'var' with a '{ get }' specifier}}
|
|
class let l2: Int // expected-error {{class properties are only allowed within classes; use 'static' to declare a requirement fulfilled by either a static or class property}} {{3-8=static}} expected-error {{protocols cannot require properties to be immutable; declare read-only properties by using 'var' with a '{ get }' specifier}}
|
|
}
|
|
|
|
extension P {
|
|
class var v4: Int { return 0 } // expected-error {{class properties are only allowed within classes; use 'static' to declare a static property}} {{3-8=static}}
|
|
}
|
|
|
|
struct S1 {
|
|
// rdar://15626843
|
|
static var x: Int // expected-error {{'static var' declaration requires an initializer expression or an explicitly stated getter}}
|
|
// expected-note@-1 {{add an initializer to silence this error}} {{17-17= = <#initializer#>}}
|
|
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 supported}} expected-error {{'class var' declaration requires an initializer expression or an explicitly stated getter}}
|
|
// expected-note@-1 {{add an initializer to silence this error}} {{16-16= = <#initializer#>}}
|
|
class let x: Int // expected-error {{class stored properties not supported}} expected-error {{'class let' declaration requires an initializer expression or an explicitly stated getter}}
|
|
// expected-note@-1 {{add an initializer to silence this error}} {{16-16= = <#initializer#>}}
|
|
static var x: Int // expected-error {{'static var' declaration requires an initializer expression or an explicitly stated getter}}
|
|
// expected-note@-1 {{add an initializer to silence this error}} {{17-17= = <#initializer#>}}
|
|
static let x: Int // expected-error {{'static let' declaration requires an initializer expression or an explicitly stated getter}}
|
|
// expected-note@-1 {{add an initializer to silence this error}} {{17-17= = <#initializer#>}}
|
|
|
|
// FIXME: We immediately invalidate the pattern binding after the first error
|
|
// is emitted, but we could definitely emit a second round of fixits for the
|
|
// other pattern here.
|
|
static var (x, y): (Int, Int), (z, w): (Int, Int) // expected-error {{'static var' declaration requires an initializer expression or an explicitly stated getter}}
|
|
// expected-note@-1 {{add an initializer to silence this error}} {{31-31= = <#initializer#>}}
|
|
}
|
|
|
|
class C2 {
|
|
var x: Int = 19
|
|
class var x: Int = 17 // expected-error{{class stored properties not supported}}
|
|
|
|
func xx() -> Int { return self.x + C2.x }
|
|
}
|
|
|
|
class ClassHasVars {
|
|
static var computedStatic: Int { return 0 } // expected-note 3{{overridden declaration is here}}
|
|
final class var computedFinalClass: Int { return 0 } // expected-note 3{{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 {{cannot override static property}}
|
|
override static var computedFinalClass: Int { return 1 } // expected-error {{static property overrides a 'final' class property}}
|
|
override class var computedClass: Int { return 1 }
|
|
override var computedInstance: Int { return 1 }
|
|
}
|
|
class ClassOverridesVars2 : ClassHasVars {
|
|
override final class var computedStatic: Int { return 1 } // expected-error {{cannot override static property}}
|
|
override final class var computedFinalClass: Int { return 1 } // expected-error {{class property overrides a 'final' class property}}
|
|
}
|
|
class ClassOverridesVars3 : ClassHasVars {
|
|
override class var computedStatic: Int { return 1 } // expected-error {{cannot override static property}}
|
|
override class var computedFinalClass: Int { return 1 } // expected-error {{class property overrides a 'final' class property}}
|
|
}
|
|
|
|
struct S2 {
|
|
var x: Int = 19
|
|
static var x: Int = 17
|
|
|
|
func xx() -> Int { return self.x + C2.x }
|
|
}
|
|
|
|
// Mutating vs non-mutating conflict with static stored property witness - 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
|
|
}
|
|
|
|
// Make sure the logic remains correct if we synthesized accessors for our stored property
|
|
protocol ProtosEvilTwin {
|
|
static var name: String {get set}
|
|
}
|
|
|
|
extension ProtoAdopter : ProtosEvilTwin {}
|
|
|
|
// rdar://18990358
|
|
public struct Foo { // expected-note {{to match this opening '{'}}}
|
|
public static let S { _ = 0; aaaaaa // expected-error{{computed property must have an explicit type}} {{22-22=: <# Type #>}}
|
|
// expected-error@-1{{type annotation missing in pattern}}
|
|
// expected-error@-2{{'let' declarations cannot be computed properties}} {{17-20=var}}
|
|
// expected-error@-3{{cannot find 'aaaaaa' in scope}}
|
|
}
|
|
|
|
// expected-error@+1 {{expected '}' in struct}}
|