mirror of
https://github.com/apple/swift.git
synced 2025-12-14 20:36:38 +01:00
The Swift Simplification pass can do more than the old MandatoryCombine pass: simplification of more instruction types and dead code elimination. The result is a better -Onone performance while still keeping debug info consistent. Currently following code patterns are simplified: * `struct` -> `struct_extract` * `enum` -> `unchecked_enum_data` * `partial_apply` -> `apply` * `br` to a 1:1 related block * `cond_br` with a constant condition * `isConcrete` and `is_same_metadata` builtins More simplifications can be added in the future. rdar://96708429 rdar://104562580
199 lines
6.5 KiB
Swift
199 lines
6.5 KiB
Swift
// RUN: %empty-directory(%t)
|
|
//
|
|
// RUN: %target-clang -fobjc-arc %S/Inputs/ObjCClasses/ObjCClasses.m -c -o %t/ObjCClasses.o
|
|
// RUN: %target-build-swift -I %S/Inputs/ObjCClasses/ %t/ObjCClasses.o %s -o %t/a.out
|
|
// RUN: %target-codesign %t/a.out
|
|
// RUN: %target-run %t/a.out
|
|
|
|
// REQUIRES: executable_test
|
|
// REQUIRES: objc_interop
|
|
|
|
import Foundation
|
|
import StdlibUnittest
|
|
import ObjCClasses
|
|
|
|
var ImportedObjCGenerics = TestSuite("ImportedObjCGenerics")
|
|
|
|
ImportedObjCGenerics.test("Creation") {
|
|
let cs = Container<NSString>(object: "i-just-met-you")
|
|
expectEqual("i-just-met-you", cs.object)
|
|
expectTrue(type(of: cs) === Container<NSString>.self)
|
|
expectTrue(type(of: cs) === Container<AnyObject>.self)
|
|
}
|
|
|
|
ImportedObjCGenerics.test("Blocks") {
|
|
let cs = Container<NSString>(object: "and-this-is-crazy")
|
|
|
|
var fromBlock: NSString = ""
|
|
cs.processObject { fromBlock = $0 }
|
|
expectEqual("and-this-is-crazy", fromBlock)
|
|
|
|
cs.updateObject { "but-heres-my-number" }
|
|
expectEqual("but-heres-my-number", cs.object)
|
|
}
|
|
|
|
ImportedObjCGenerics.test("Categories") {
|
|
let cs = Container<NSString>(cat1: "so-call-me-maybe")
|
|
expectEqual("so-call-me-maybe", cs.getCat1())
|
|
|
|
cs.setCat1("its-hard-to-look-right")
|
|
expectEqual("its-hard-to-look-right", cs.cat1Property)
|
|
}
|
|
|
|
ImportedObjCGenerics.test("Subclasses") {
|
|
let subContainer = SubContainer<NSString>(object: "at-you-baby")
|
|
expectEqual("at-you-baby", subContainer.object)
|
|
|
|
let nestedContainer = NestedContainer<NSString>(object: Container(object: "but-heres-my-number"))
|
|
expectEqual("but-heres-my-number", nestedContainer.object.object)
|
|
|
|
let stringContainer = StringContainer(object: "so-call-me-maybe")
|
|
expectEqual("so-call-me-maybe", stringContainer.object)
|
|
}
|
|
|
|
ImportedObjCGenerics.test("SwiftGenerics") {
|
|
func openContainer<T: AnyObject>(_ x: Container<T>) -> T {
|
|
return x.object
|
|
}
|
|
func openStringContainer<T: Container<NSString>>(_ x: T) -> NSString {
|
|
return x.object
|
|
}
|
|
func openArbitraryContainer<S: AnyObject, T: Container<S>>(_ x: T) -> S {
|
|
return x.object
|
|
}
|
|
|
|
let scs = SubContainer<NSString>(object: "before-you-came-into-my-life")
|
|
expectEqual("before-you-came-into-my-life", openContainer(scs))
|
|
expectEqual("before-you-came-into-my-life", openStringContainer(scs))
|
|
expectEqual("before-you-came-into-my-life", openArbitraryContainer(scs))
|
|
|
|
let cs = Container<NSString>(object: "i-missed-you-so-bad")
|
|
expectEqual("i-missed-you-so-bad", openContainer(cs))
|
|
expectEqual("i-missed-you-so-bad", openStringContainer(cs))
|
|
expectEqual("i-missed-you-so-bad", openArbitraryContainer(cs))
|
|
|
|
let strContainer = SubContainer<NSString>(object: "i-missed-you-so-so-bad")
|
|
expectEqual("i-missed-you-so-so-bad", openContainer(strContainer))
|
|
expectEqual("i-missed-you-so-so-bad", openStringContainer(strContainer))
|
|
expectEqual("i-missed-you-so-so-bad", openArbitraryContainer(strContainer))
|
|
|
|
let numContainer = Container<NSNumber>(object: NSNumber(value: 21))
|
|
expectEqual(NSNumber(value: 21), openContainer(numContainer))
|
|
expectEqual(NSNumber(value: 21), openArbitraryContainer(numContainer))
|
|
|
|
let subNumContainer = SubContainer<NSNumber>(object: NSNumber(value: 22))
|
|
expectEqual(NSNumber(value: 22), openContainer(subNumContainer))
|
|
expectEqual(NSNumber(value: 22), openArbitraryContainer(subNumContainer))
|
|
}
|
|
|
|
ImportedObjCGenerics.test("SwiftGenerics/Creation") {
|
|
func makeContainer<T: AnyObject>(_ x: T) -> Container<T> {
|
|
return Container(object: x)
|
|
}
|
|
|
|
let c = makeContainer(NSNumber(value: 22))
|
|
expectEqual(NSNumber(value: 22), c.object)
|
|
}
|
|
|
|
ImportedObjCGenerics.test("ProtocolConstraints") {
|
|
func copyContainerContents<T: NSCopying>(_ x: CopyingContainer<T>) -> T {
|
|
return x.object.copy(with: nil) as! T
|
|
}
|
|
|
|
let cs = CopyingContainer<NSString>(object: "Happy 2012")
|
|
expectEqual("Happy 2012", copyContainerContents(cs))
|
|
}
|
|
|
|
ImportedObjCGenerics.test("ClassConstraints") {
|
|
func makeContainedAnimalMakeNoise<T>(x: AnimalContainer<T>) -> NSString {
|
|
return x.object.noise as NSString
|
|
}
|
|
let petCarrier = AnimalContainer(object: Dog())
|
|
expectEqual("woof", makeContainedAnimalMakeNoise(x: petCarrier))
|
|
}
|
|
|
|
@objc @objcMembers class ClassWithMethodsUsingObjCGenerics: NSObject {
|
|
func copyContainer(_ x: CopyingContainer<NSString>) -> CopyingContainer<NSString> {
|
|
return x
|
|
}
|
|
func maybeCopyContainer(_ x: CopyingContainer<NSString>) -> CopyingContainer<NSString>? {
|
|
return x
|
|
}
|
|
}
|
|
|
|
ImportedObjCGenerics.test("ClassWithMethodsUsingObjCGenerics") {
|
|
let x: AnyObject = ClassWithMethodsUsingObjCGenerics()
|
|
let y = CopyingContainer<NSString>(object: "")
|
|
let z = x.copyContainer(y)
|
|
expectTrue(y === z)
|
|
let w = x.perform(#selector(ClassWithMethodsUsingObjCGenerics.copyContainer), with: y).takeUnretainedValue()
|
|
expectTrue(y === w)
|
|
|
|
let zq = x.maybeCopyContainer(y)
|
|
expectTrue(y === zq!)
|
|
let wq = x.perform(#selector(ClassWithMethodsUsingObjCGenerics.maybeCopyContainer), with: y).takeUnretainedValue()
|
|
expectTrue(y === wq)
|
|
}
|
|
|
|
ImportedObjCGenerics.test("InheritanceFromNongeneric") {
|
|
// Test NSObject methods inherited into Container<>
|
|
let gc = Container<NSString>(object: "")
|
|
expectTrue(gc.description.range(of: "Container") != nil)
|
|
expectTrue(type(of: gc).superclass() == NSObject.self)
|
|
expectTrue(Container<NSString>.superclass() == NSObject.self)
|
|
expectTrue(Container<NSObject>.superclass() == NSObject.self)
|
|
expectTrue(Container<NSObject>.self == Container<NSString>.self)
|
|
expectTrue((Container<NSObject>, Int).self == (Container<NSString>, Int).self)
|
|
}
|
|
|
|
public class InheritInSwift: Container<NSString> {
|
|
public override init(object: NSString) {
|
|
super.init(object: object.lowercased as NSString)
|
|
}
|
|
public override var object: NSString {
|
|
get {
|
|
return super.object.uppercased as NSString
|
|
}
|
|
set {
|
|
super.object = newValue.lowercased as NSString
|
|
}
|
|
}
|
|
|
|
public var superObject: NSString {
|
|
get {
|
|
return super.object as NSString
|
|
}
|
|
}
|
|
}
|
|
|
|
ImportedObjCGenerics.test("InheritInSwift") {
|
|
let s = InheritInSwift(object: "HEllo")
|
|
let sup: Container = s
|
|
|
|
expectEqual(s.superObject, "hello")
|
|
expectEqual(s.object, "HELLO")
|
|
expectEqual(sup.object, "HELLO")
|
|
|
|
s.object = "GOodbye"
|
|
expectEqual(s.superObject, "goodbye")
|
|
expectEqual(s.object, "GOODBYE")
|
|
expectEqual(sup.object, "GOODBYE")
|
|
|
|
s.processObject { o in
|
|
expectEqual(o, "GOODBYE")
|
|
}
|
|
|
|
s.updateObject { "Aloha" }
|
|
expectEqual(s.superObject, "aloha")
|
|
expectEqual(s.object, "ALOHA")
|
|
expectEqual(sup.object, "ALOHA")
|
|
}
|
|
|
|
ImportedObjCGenerics.test("BridgedInitializer") {
|
|
let strings: [NSString] = ["hello", "world"]
|
|
let s = BridgedInitializer(array: strings)
|
|
expectEqual(s.count, 2)
|
|
}
|
|
|
|
runAllTests()
|