mirror of
https://github.com/apple/swift.git
synced 2025-12-21 12:14:44 +01:00
instead of using name and decl context. The advantages of this approach are three-fold: - This is necessary to support inlined generic functions. - We can retire the debugger-specific type name manfgling mode for archetypes. - This saves 270kb of debug information in the x86_64 libSwiftCore.dylib alone. <rdar://problem/38306256>
56 lines
1.2 KiB
Swift
56 lines
1.2 KiB
Swift
// RUN: %target-swift-frontend -Xllvm -sil-inline-generics=true %s -O -g -o - -emit-ir | %FileCheck %s
|
|
public protocol P {
|
|
associatedtype DT1
|
|
func getDT() -> DT1
|
|
}
|
|
|
|
@inline(__always)
|
|
func foo1<T:P>(_ t: T, _ dt: T.DT1) -> T.DT1 {
|
|
var dttmp: T.DT1 = dt
|
|
return dttmp
|
|
}
|
|
|
|
// CHECK: define {{.*}}@"$S4main4foo2yyxAA1PRzlF"
|
|
public func foo2<S:P>(_ s: S) {
|
|
// CHECK: call void @llvm.dbg.value(metadata %swift.type* %S.DT1,
|
|
// CHECK-SAME: metadata ![[META:[0-9]+]]
|
|
foo1(s, s.getDT())
|
|
// T.DT1 should get substituted with S.DT1.
|
|
// CHECK: ![[META]] = !DILocalVariable(name: "$\CF\84_0_0.DT1"
|
|
}
|
|
|
|
|
|
// More complex example -- we inline an alloc_stack that references a VarDecl
|
|
// with generic type.
|
|
|
|
public protocol Q : class {
|
|
associatedtype T : Equatable
|
|
|
|
var old: T? { get set }
|
|
var new: T? { get }
|
|
}
|
|
|
|
@inline(__always)
|
|
public func update<S : Q>(_ s: S) -> (S.T?, S.T?)? {
|
|
let oldValue = s.old
|
|
let newValue = s.new
|
|
|
|
if oldValue != newValue {
|
|
s.old = newValue
|
|
return (oldValue, newValue)
|
|
} else {
|
|
return nil
|
|
}
|
|
}
|
|
|
|
public class C : Q {
|
|
public typealias T = String
|
|
|
|
public var old: String? = nil
|
|
public var new: T? = nil
|
|
}
|
|
|
|
public func updateC(_ c: C) {
|
|
update(c)
|
|
}
|