mirror of
https://github.com/apple/swift.git
synced 2025-12-21 12:14:44 +01:00
It is necessary for opaque values where for casts that will newly start out as checked_cast_brs and be lowered to checked_cast_addr_brs, since the latter has the source formal type, IRGen relies on being able to access it, and there's no way in general to obtain the source formal type from the source lowered type.
33 lines
1.0 KiB
Swift
33 lines
1.0 KiB
Swift
|
|
// RUN: %target-swift-frontend -module-name devirt_speculative_nested %s -parse-as-library -enable-spec-devirt -O -emit-sil | %FileCheck %s
|
|
// RUN: %target-swift-frontend -module-name devirt_speculative_nested %s -parse-as-library -Osize -emit-sil
|
|
//
|
|
// Test speculative devirtualization.
|
|
|
|
public class Outer<T> {
|
|
final class Inner : Base {
|
|
@inline(never) override func update() {
|
|
}
|
|
}
|
|
}
|
|
|
|
public class Base {
|
|
@inline(never) func update() { }
|
|
}
|
|
|
|
// FIXME: We don't speculate to the override Outer<T>.Inner.update() here,
|
|
// because we cannot express the cast -- the cast "returns" a new archetype
|
|
// T, much like an opened existential.
|
|
//
|
|
// But at least, we shouldn't crash.
|
|
|
|
// CHECK-LABEL: sil @$s25devirt_speculative_nested3foo1xyAA4BaseC_tF : $@convention(thin) (@guaranteed Base) -> ()
|
|
// CHECK: checked_cast_br [exact] Base in %0 : $Base to Base
|
|
// CHECK: function_ref @$s25devirt_speculative_nested4BaseC6updateyyF
|
|
// CHECK: class_method %0 : $Base, #Base.update
|
|
// CHECK: return
|
|
|
|
public func foo(x: Base) {
|
|
x.update()
|
|
}
|