1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134
|
// RUN: %target-typecheck-verify-swift
class Writer {
private var articleWritten = 47
func stop() {
let rest: () -> Void = { [weak self] in
let articleWritten = self?.articleWritten ?? 0
guard let `self` = self else {
return
}
self.articleWritten = articleWritten
}
fatalError("I'm running out of time")
rest()
}
func nonStop() {
let write: () -> Void = { [weak self] in
self?.articleWritten += 1
if let self = self {
self.articleWritten += 1
}
if let `self` = self {
self.articleWritten += 1
}
guard let self = self else {
return
}
self.articleWritten += 1
}
write()
}
}
struct T {
var mutable: Int = 0
func f() {
// expected-error @+2 {{keyword 'self' cannot be used as an identifier here}}
// expected-note @+1 {{if this name is unavoidable, use backticks to escape it}}
let self = self
}
}
class MyCls {
func something() {}
func test() {
// expected-warning @+1 {{initialization of immutable value 'self' was never used}}
let `self` = Writer() // Even if `self` is shadowed,
something() // this should still refer `MyCls.something`.
}
}
// https://github.com/apple/swift/issues/47136
// Method called 'self' can be confused with regular 'self'
func funcThatReturnsSomething(_ any: Any) -> Any {
any
}
struct TypeWithSelfMethod {
let property = self // expected-warning {{'self' refers to the method 'TypeWithSelfMethod.self', which may be unexpected}} expected-note{{use 'TypeWithSelfMethod.self' to silence this warning}} {{20-20=TypeWithSelfMethod.}}
// Existing warning expected, not confusable
let property2 = self() // expected-error {{cannot use instance member 'self' within property initializer; property initializers run before 'self' is available}}
let propertyFromClosure: () = {
print(self) // expected-warning {{'self' refers to the method 'TypeWithSelfMethod.self', which may be unexpected}} expected-note{{use 'TypeWithSelfMethod.self' to silence this warning}} {{15-15=TypeWithSelfMethod.}}
}()
let propertyFromFunc = funcThatReturnsSomething(self) // expected-warning {{'self' refers to the method 'TypeWithSelfMethod.self', which may be unexpected}} expected-note{{use 'TypeWithSelfMethod.self' to silence this warning}} {{53-53=TypeWithSelfMethod.}}
let propertyFromFunc2 = funcThatReturnsSomething(TypeWithSelfMethod.self) // OK
func `self`() {
}
}
/// Test fix_unqualified_access_member_named_self doesn't appear for computed var called `self`
/// it can't currently be referenced as a static member -- unlike a method with the same name
struct TypeWithSelfComputedVar {
let property = self // expected-error {{cannot use instance member 'self' within property initializer; property initializers run before 'self' is available}}
let propertyFromClosure: () = {
print(self) // expected-error {{cannot use instance member 'self' within property initializer; property initializers run before 'self' is available}}
}()
let propertyFromFunc = funcThatReturnsSomething(self) // expected-error {{cannot use instance member 'self' within property initializer; property initializers run before 'self' is available}}
var `self`: () {
()
}
}
/// Test fix_unqualified_access_member_named_self doesn't appear for property called `self`
/// it can't currently be referenced as a static member -- unlike a method with the same name
struct TypeWithSelfProperty {
let property = self // expected-error {{cannot use instance member 'self' within property initializer; property initializers run before 'self' is available}}
let propertyFromClosure: () = {
print(self) // expected-error {{cannot use instance member 'self' within property initializer; property initializers run before 'self' is available}}
}()
let propertyFromFunc = funcThatReturnsSomething(self) // expected-error {{cannot use instance member 'self' within property initializer; property initializers run before 'self' is available}}
let `self`: () = ()
}
enum EnumCaseNamedSelf {
case `self`
init() {
self = .self // OK
self = .`self` // OK
self = EnumCaseNamedSelf.`self` // OK
}
}
// rdar://90624344 - warning about `self` which cannot be fixed because it's located in implicitly generated code.
struct TestImplicitSelfUse : Codable {
let `self`: Int // Ok
}
|