mirror of
https://github.com/apple/swift.git
synced 2025-12-21 12:14:44 +01:00
We were failing to replace opaque types with their underlying type upon encountering an internal type from the current module. This could happen when the internal type appeared in generic substitutions, for example when calling a protocol extension method. Fixes <rdar://problem/60951353>.
22 lines
916 B
Swift
22 lines
916 B
Swift
// RUN: %target-swift-frontend -enable-library-evolution -disable-availability-checking -O -emit-sil %s
|
|
// RUN: %target-swift-frontend -enable-library-evolution -disable-availability-checking -Onone -emit-sil %s | %FileCheck %s
|
|
|
|
public protocol P {}
|
|
|
|
public struct Underlying : P {
|
|
}
|
|
|
|
public func returnOpaque() -> some P {
|
|
return Underlying()
|
|
}
|
|
|
|
// CHECK-LABEL: sil [serialized] @$s19cast_folding_opaque23testCastOpaqueArchetypeAA10UnderlyingVyF
|
|
// CHECK: [[O:%.*]] = alloc_stack $@_opaqueReturnTypeOf("$s19cast_folding_opaque12returnOpaqueQryF", 0)
|
|
// CHECK: [[F:%.*]] = function_ref @$s19cast_folding_opaque12returnOpaqueQryF
|
|
// CHECK: apply [[F]]([[O]])
|
|
// CHECK: unconditional_checked_cast_addr @_opaqueReturnTypeOf{{.*}}in [[O]] : $*@_opaqueReturnTypeOf{{.*}}to Underlying in %0 : $*Underlying
|
|
@inlinable
|
|
public func testCastOpaqueArchetype() -> Underlying {
|
|
return returnOpaque() as! Underlying
|
|
}
|