blob: 744fd3849d3040a119117cdc4644b650b061db1d [file] [log] [blame]
// RUN: %empty-directory(%t)
// RUN: %target-build-swift -O %s -o %t/a.out
// RUN: %target-build-swift -O %s -emit-ir | %FileCheck --check-prefix=CHECK-IR %s
// RUN: %target-codesign %t/a.out
// RUN: %target-run %t/a.out | %FileCheck %s
// REQUIRES: executable_test
// Check if the runtime function swift_getObjectType is not readnone and
// therefore not re-scheduled with release-calls, which would lead to a crash
// in this example.
public protocol Proto: class {
static func printit()
}
public final class ConformingClass : Proto {
public static func printit() { print("okay") }
}
public final class Creator {
@inline(never)
public init() {}
@inline(never)
public func createIt() -> Proto {
return ConformingClass ()
}
}
func work() {
let myProtocolType: Proto.Type = type(of: Creator().createIt())
myProtocolType.printit()
}
// CHECK-IR: call {{.*}} @swift_getObjectType({{.*}}) #[[M:[0-9]]]
// CHECK-IR: declare {{.*}} @swift_getObjectType{{.*}} #[[M]]
// CHECK-IR: attributes #[[M]] = { nounwind readonly }
// CHECK: okay
work()