-
Notifications
You must be signed in to change notification settings - Fork 10.5k
/
Copy pathPrivateDiscriminator.swift
57 lines (49 loc) · 2.05 KB
/
PrivateDiscriminator.swift
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
// Private discriminators should only be emitted for multi-file projects.
// RUN: %target-swift-frontend -emit-ir %s -g -o - \
// RUN: | %FileCheck --check-prefix=SINGLE %s
// SINGLE-NOT: !DICompileUnit({{.*}}-private-discriminator
// RUN: %target-swift-frontend %S/../Inputs/empty.swift -primary-file %s \
// RUN: -emit-ir -g | %FileCheck %s
// CHECK: !DICompileUnit({{.*}}flags: {{[^,]*}}-private-discriminator [[DISCRIMINATOR:_[A-Z0-9]+]]
// CHECK: ![[MOD:.*]] = !DIModule(scope: null,
// CHECK: !DICompositeType(tag: DW_TAG_structure_type, name: "InA",
// CHECK-SAME: scope: ![[A:[0-9]+]],
// CHECK: ![[A]] = !DICompositeType(tag: DW_TAG_structure_type, name: "A",
// CHECK-SAME: scope: ![[NS:[0-9]+]]
// CHECK: !DINamespace(name: "[[DISCRIMINATOR]]",
// CHECK-SAME: scope: ![[OUTER:[0-9]+]], exportSymbols: true)
// CHECK: ![[OUTER]] = !DICompositeType(tag: DW_TAG_structure_type,
// CHECK-SAME: name: "Outer",
// CHECK-SAME: scope: ![[MOD]],
func markUsed<T>(_ t: T) {}
public class Outer {
fileprivate class A {
fileprivate struct InA {
let i : Int64
init(_ val : Int64) { i = val }
}
init(val : Int64) { member = InA(val) }
fileprivate let member : InA
// CHECK: !DISubprogram(name: "getMember"
// CHECK-SAME: linkageName: "{{[^"]*}}[[DISCRIMINATOR]]
// CHECK-SAME: line: [[@LINE+2]]
// CHECK-SAME: spFlags: DISPFlagLocalToUnit | DISPFlagDefinition
fileprivate func getMember() -> Int64 { return member.i }
}
}
// CHECK: ![[G:[0-9]+]] = distinct !DISubprogram(name: "g",
// CHECK-SAME: scope: ![[MOD]]
fileprivate func g() -> Int64 {
// CHECK: !DICompositeType(tag: DW_TAG_structure_type, name: "InG",
// CHECK-SAME: scope: ![[G]],
struct InG {
let i : Int64
init(_ val : Int64) { i = val }
}
return InG(42).i
}
// CHECK: distinct !DISubprogram(name: "f", {{.*}}, scope: ![[MOD]]
public func f() {
let a = Outer.A(val: g())
markUsed(a)
}