| // 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: "$swift.type.S.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) |
| } |