mirror of
https://github.com/apple/swift.git
synced 2025-12-14 20:36:38 +01:00
346 lines
9.2 KiB
Swift
346 lines
9.2 KiB
Swift
// RUN: %empty-directory(%t)
|
|
// RUN: %target-swift-frontend -emit-module -o %t/Test.swiftmodule -emit-module-interface-path %t/Test.swiftinterface -module-name Test %s
|
|
// RUN: %FileCheck %s --check-prefix FROMSOURCE --check-prefix CHECK < %t/Test.swiftinterface
|
|
// RUN: %target-swift-typecheck-module-from-interface(%t/Test.swiftinterface) -module-name Test
|
|
// RUN: %target-swift-frontend -emit-module -o /dev/null -merge-modules %t/Test.swiftmodule -disable-objc-attr-requires-foundation-module -emit-module-interface-path %t/TestFromModule.swiftinterface -module-name Test
|
|
// RUN: %target-swift-typecheck-module-from-interface(%t/TestFromModule.swiftinterface) -module-name Test
|
|
// RUN: %FileCheck %s --check-prefix FROMMODULE --check-prefix CHECK < %t/TestFromModule.swiftinterface
|
|
|
|
// CHECK-LABEL: public struct Foo : Swift.Hashable {
|
|
public struct Foo: Hashable {
|
|
// CHECK: public var inlinableGetPublicSet: Swift.Int {
|
|
public var inlinableGetPublicSet: Int {
|
|
// FROMSOURCE: @inlinable get {
|
|
// FROMMODULE: @inlinable get{{$}}
|
|
// FROMSOURCE-NEXT: return 3
|
|
// FROMSOURCE-NEXT: }
|
|
@inlinable
|
|
get {
|
|
return 3
|
|
}
|
|
// CHECK-NEXT: set[[NEWVALUE:(\(newValue\))?]]{{$}}
|
|
set {
|
|
print("I am set to \(newValue)")
|
|
}
|
|
// CHECK-NEXT: {{^}} }
|
|
}
|
|
|
|
// CHECK: public var noAccessors: Swift.Int{{$}}
|
|
public var noAccessors: Int
|
|
|
|
// CHECK: public var hasDidSet: Swift.Int {
|
|
public var hasDidSet: Int {
|
|
// CHECK-NEXT: get{{$}}
|
|
// CHECK-NEXT: set{{(\(value\))?}}{{$}}
|
|
// CHECK-NOT: didSet
|
|
didSet {
|
|
print("b set to \(hasDidSet)")
|
|
}
|
|
// CHECK-NEXT: {{^}} }
|
|
}
|
|
|
|
// CHECK: @_transparent public var transparent: Swift.Int {
|
|
// FROMMODULE-NEXT: get{{$}}
|
|
// FROMSOURCE-NEXT: get {
|
|
// FROMSOURCE-NEXT: return 34
|
|
// FROMSOURCE-NEXT: }
|
|
// CHECK-NEXT: }
|
|
@_transparent
|
|
public var transparent: Int {
|
|
return 34
|
|
}
|
|
|
|
// CHECK: public var transparentSet: Swift.Int {
|
|
public var transparentSet: Int {
|
|
// CHECK-NEXT: get{{$}}
|
|
get {
|
|
return 34
|
|
}
|
|
// FROMMODULE-NEXT: @_transparent set[[NEWVALUE]]{{$}}
|
|
// FROMSOURCE-NEXT: @_transparent set[[NEWVALUE]] {
|
|
// FROMSOURCE-NOT: #if false
|
|
// FROMSOURCE-NOT: print("I should not appear")
|
|
// FROMSOURCE-NOT: #else
|
|
// FROMSOURCE-NOT: #if false
|
|
// FROMSOURCE-NOT: print("I also should not")
|
|
// FROMSOURCE-NOT: #else
|
|
// FROMSOURCE: print("I am set to \(newValue)")
|
|
// FROMSOURCE-NOT: #endif
|
|
// FROMSOURCE-NOT: #endif
|
|
// FROMSOURCE-NEXT: }
|
|
@_transparent
|
|
set {
|
|
#if false
|
|
print("I should not appear")
|
|
#else
|
|
#if false
|
|
print("I also should not")
|
|
#else
|
|
print("I am set to \(newValue)")
|
|
#endif
|
|
#endif
|
|
}
|
|
}
|
|
|
|
// CHECK: @inlinable public var inlinableProperty: Swift.Int {
|
|
@inlinable
|
|
public var inlinableProperty: Int {
|
|
// FROMMODULE: get{{$}}
|
|
// FROMSOURCE: get {
|
|
// FROMSOURCE-NEXT: return 32
|
|
// FROMSOURCE-NEXT: }
|
|
get {
|
|
return 32
|
|
}
|
|
|
|
// FROMMODULE: set[[NEWVALUE]]{{$}}
|
|
// FROMSOURCE: set[[NEWVALUE]] {
|
|
// FROMSOURCE-NOT: #if true
|
|
// FROMSOURCE: print("I am set to \(newValue)")
|
|
// FROMSOURCE-NOT: #else
|
|
// FROMSOURCE-NOT: print("I should not appear")
|
|
// FROMSOURCE-NOT: #endif
|
|
// FROMSOURCE: }
|
|
set {
|
|
#if true
|
|
print("I am set to \(newValue)")
|
|
#else
|
|
print("I should not appear")
|
|
#endif
|
|
}
|
|
// CHECK-NEXT: }
|
|
}
|
|
|
|
// CHECK: @inlinable public var inlinableReadAndModify: Swift.Int {
|
|
@inlinable
|
|
public var inlinableReadAndModify: Int {
|
|
// FROMMODULE: _read{{$}}
|
|
// FROMSOURCE: _read {
|
|
// FROMSOURCE-NEXT: yield 0
|
|
// FROMSOURCE-NEXT: }
|
|
_read {
|
|
yield 0
|
|
}
|
|
// FROMMODULE: _modify{{$}}
|
|
// FROMSOURCE: _modify {
|
|
// FROMSOURCE-NEXT: var x = 0
|
|
// FROMSOURCE-NEXT: yield &x
|
|
// FROMSOURCE-NEXT: }
|
|
_modify {
|
|
var x = 0
|
|
yield &x
|
|
}
|
|
// CHECK-NEXT: }
|
|
}
|
|
|
|
// CHECK: public var inlinableReadNormalModify: Swift.Int {
|
|
public var inlinableReadNormalModify: Int {
|
|
// FROMMODULE: @inlinable _read{{$}}
|
|
// FROMSOURCE: @inlinable _read {
|
|
// FROMSOURCE-NEXT: yield 0
|
|
// FROMSOURCE-NEXT: }
|
|
@inlinable _read {
|
|
yield 0
|
|
}
|
|
|
|
// CHECK: _modify{{$}}
|
|
// CHECK-NOT: var x = 0
|
|
// CHECK-NOT: yield &x
|
|
// CHECK-NOT: }
|
|
_modify {
|
|
var x = 0
|
|
yield &x
|
|
}
|
|
// CHECK-NEXT: }
|
|
}
|
|
|
|
// CHECK: public var normalReadInlinableModify: Swift.Int {
|
|
public var normalReadInlinableModify: Int {
|
|
// CHECK: _read{{$}}
|
|
// CHECK-NOT: yield 0
|
|
// CHECK-NOT: }
|
|
_read {
|
|
yield 0
|
|
}
|
|
|
|
// FROMMODULE: @inlinable _modify{{$}}
|
|
// FROMSOURCE: @inlinable _modify {
|
|
// FROMSOURCE-NEXT: var x = 0
|
|
// FROMSOURCE-NEXT: yield &x
|
|
// FROMSOURCE-NEXT: }
|
|
@inlinable _modify {
|
|
var x = 0
|
|
yield &x
|
|
}
|
|
// CHECK-NEXT: }
|
|
}
|
|
|
|
// CHECK: public var normalReadAndModify: Swift.Int {
|
|
public var normalReadAndModify: Int {
|
|
// CHECK-NEXT: _read{{$}}
|
|
_read { yield 0 }
|
|
// CHECK-NEXT: _modify{{$}}
|
|
_modify {
|
|
var x = 0
|
|
yield &x
|
|
}
|
|
// CHECK-NEXT: }
|
|
}
|
|
|
|
// FROMMODULE: @inlinable public func inlinableMethod(){{$}}
|
|
// FROMSOURCE: @inlinable public func inlinableMethod() {
|
|
// FROMSOURCE-NOT: #if NO
|
|
// FROMSOURCE-NOT: print("Hello, world!")
|
|
// FROMSOURCE-NOT: #endif
|
|
// FROMSOURCE: print("Goodbye, world!")
|
|
// FROMSOURCE-NEXT: }
|
|
@inlinable
|
|
public func inlinableMethod() {
|
|
#if NO
|
|
print("Hello, world!")
|
|
#endif
|
|
print("Goodbye, world!")
|
|
}
|
|
|
|
|
|
// FROMMODULE: @_transparent [[ATTRS:(mutating public|public mutating)]] func transparentMethod(){{$}}
|
|
// FROMSOURCE: @_transparent [[ATTRS:(mutating public|public mutating)]] func transparentMethod() {
|
|
// FROMSOURCE-NEXT: inlinableProperty = 4
|
|
// FROMSOURCE-NEXT: }
|
|
@_transparent
|
|
mutating public func transparentMethod() {
|
|
inlinableProperty = 4
|
|
}
|
|
|
|
// CHECK: public func nonInlinableMethod(){{$}}
|
|
// CHECK-NOT: print("Not inlinable")
|
|
public func nonInlinableMethod() {
|
|
print("Not inlinable")
|
|
}
|
|
|
|
// CHECK: public subscript(i: Swift.Int) -> Swift.Int {
|
|
// CHECK-NEXT: get{{$}}
|
|
// FROMSOURCE-NEXT: @inlinable set[[NEWVALUE]] { print("set") }
|
|
// FROMMODULE-NEXT: @inlinable set[[NEWVALUE]]{{$}}
|
|
// CHECK-NEXT: }
|
|
public subscript(i: Int) -> Int {
|
|
get { return 0 }
|
|
@inlinable set { print("set") }
|
|
}
|
|
|
|
// CHECK: public subscript(j: Swift.Int, k: Swift.Int) -> Swift.Int {
|
|
// FROMMODULE-NEXT: @inlinable get{{$}}
|
|
// FROMSOURCE-NEXT: @inlinable get { return 0 }
|
|
// CHECK-NEXT: set[[NEWVALUE]]{{$}}
|
|
// CHECK-NEXT: }
|
|
public subscript(j: Int, k: Int) -> Int {
|
|
@inlinable get { return 0 }
|
|
set { print("set") }
|
|
}
|
|
|
|
// CHECK: @inlinable public subscript(l: Swift.Int, m: Swift.Int, n: Swift.Int) -> Swift.Int {
|
|
// FROMMODULE-NEXT: get{{$}}
|
|
// FROMSOURCE-NEXT: get { return 0 }
|
|
// FROMMODULE-NEXT: set[[NEWVALUE]]{{$}}
|
|
// FROMSOURCE-NEXT: set[[NEWVALUE]] { print("set") }
|
|
// CHECK-NEXT: }
|
|
@inlinable
|
|
public subscript(l: Int, m: Int, n: Int) -> Int {
|
|
get { return 0 }
|
|
set { print("set") }
|
|
}
|
|
|
|
// FROMMODULE: @inlinable public init(value: Swift.Int){{$}}
|
|
// FROMSOURCE: @inlinable public init(value: Swift.Int) {
|
|
// FROMSOURCE-NEXT: topLevelUsableFromInline()
|
|
// FROMSOURCE-NEXT: noAccessors = value
|
|
// FROMSOURCE-NEXT: hasDidSet = value
|
|
// FROMSOURCE-NEXT: }
|
|
@inlinable public init(value: Int) {
|
|
topLevelUsableFromInline()
|
|
noAccessors = value
|
|
hasDidSet = value
|
|
}
|
|
|
|
// CHECK: public init(){{$}}
|
|
// CHECK-NOT: noAccessors = 0
|
|
// CHECK-NOT: hasDidSet = 0
|
|
public init() {
|
|
noAccessors = 0
|
|
hasDidSet = 0
|
|
}
|
|
|
|
// CHECK: {{^}}}
|
|
}
|
|
|
|
// CHECK-NOT: private func topLevelPrivate()
|
|
private func topLevelPrivate() {
|
|
print("Ssshhhhh")
|
|
}
|
|
|
|
// CHECK: internal func topLevelUsableFromInline(){{$}}
|
|
@usableFromInline
|
|
internal func topLevelUsableFromInline() {
|
|
topLevelPrivate()
|
|
}
|
|
|
|
// FROMMODULE: @inlinable public func topLevelInlinable(){{$}}
|
|
// FROMSOURCE: @inlinable public func topLevelInlinable() {
|
|
// FROMSOURCE-NEXT: topLevelUsableFromInline()
|
|
// FROMSOURCE-NEXT: }
|
|
@inlinable public func topLevelInlinable() {
|
|
topLevelUsableFromInline()
|
|
}
|
|
|
|
// CHECK: public class HasInlinableDeinit {
|
|
public class HasInlinableDeinit {
|
|
// CHECK: public init(){{$}}
|
|
public init() {}
|
|
|
|
// FROMMODULE: [[OBJC:(@objc )?]]@inlinable deinit{{$}}
|
|
// FROMSOURCE: [[OBJC:(@objc )?]]@inlinable deinit {
|
|
// FROMSOURCE-NEXT: print("goodbye")
|
|
// FROMSOURCE-NEXT: }
|
|
@inlinable deinit {
|
|
print("goodbye")
|
|
}
|
|
|
|
// CHECK-NEXT: }
|
|
}
|
|
|
|
// CHECK: public class HasStandardDeinit {
|
|
public class HasStandardDeinit {
|
|
// CHECK: public init(){{$}}
|
|
public init() {}
|
|
|
|
// CHECK: [[OBJC]]deinit{{$}}
|
|
deinit {
|
|
print("goodbye")
|
|
}
|
|
|
|
// CHECK-NEXT: }
|
|
}
|
|
|
|
// CHECK: public class HasDefaultDeinit {
|
|
public class HasDefaultDeinit {
|
|
// CHECK: public init(){{$}}
|
|
public init() {}
|
|
|
|
// CHECK: [[OBJC]]deinit{{$}}
|
|
// CHECK-NEXT: }
|
|
}
|
|
|
|
// CHECK: public func testInlinableTextRemovesPostfix()
|
|
@inlinable public func testInlinableTextRemovesPostfix() {
|
|
// FROMSOURCE: "foobar"
|
|
// FROMSOURCE-NOT: .debugDescription
|
|
// FROMSOURCE: .description
|
|
// FROMSOURCE-NEXT: }
|
|
_ = "foobar"
|
|
#if DEBUG
|
|
.debugDescription
|
|
#else
|
|
.description
|
|
#endif
|
|
}
|