File tree Expand file tree Collapse file tree 4 files changed +35
-154
lines changed Expand file tree Collapse file tree 4 files changed +35
-154
lines changed Original file line number Diff line number Diff line change @@ -2484,9 +2484,18 @@ bool ReplaceOpaqueTypesWithUnderlyingTypes::shouldPerformSubstitution(
2484
2484
2485
2485
// Allow replacement of opaque result types of inlineable function regardless
2486
2486
// of resilience and in which context.
2487
- if (namingDecl->getAttrs ().hasAttribute <InlinableAttr>()) {
2488
- return true ;
2487
+ if (auto *afd = dyn_cast<AbstractFunctionDecl>(namingDecl)) {
2488
+ if (afd->getResilienceExpansion () == ResilienceExpansion::Minimal) {
2489
+ return true ;
2490
+ }
2491
+ } else if (auto *asd = dyn_cast<AbstractStorageDecl>(namingDecl)) {
2492
+ auto *getter = asd->getGetter ();
2493
+ if (getter &&
2494
+ getter->getResilienceExpansion () == ResilienceExpansion::Minimal) {
2495
+ return true ;
2496
+ }
2489
2497
}
2498
+
2490
2499
// Allow replacement of opaque result types in the context of maximal
2491
2500
// resilient expansion if the context's and the opaque type's module are the
2492
2501
// same.
Original file line number Diff line number Diff line change @@ -12,36 +12,9 @@ public func externalResilient() -> some ExternalP2 {
12
12
return Int64 ( 6 )
13
13
}
14
14
15
- @usableFromInline
16
- @inline ( never)
17
- func preventInlining( ) { }
18
-
19
15
@inlinable
16
+ @inline ( never)
20
17
public func inlinableExternalResilient( ) -> some ExternalP2 {
21
- preventInlining ( )
22
- preventInlining ( )
23
- preventInlining ( )
24
- preventInlining ( )
25
- preventInlining ( )
26
- preventInlining ( )
27
- preventInlining ( )
28
- preventInlining ( )
29
- preventInlining ( )
30
- preventInlining ( )
31
- preventInlining ( )
32
- preventInlining ( )
33
- preventInlining ( )
34
- preventInlining ( )
35
- preventInlining ( )
36
- preventInlining ( )
37
- preventInlining ( )
38
- preventInlining ( )
39
- preventInlining ( )
40
- preventInlining ( )
41
- preventInlining ( )
42
- preventInlining ( )
43
- preventInlining ( )
44
- preventInlining ( )
45
18
return Int64 ( 6 )
46
19
}
47
20
@@ -56,34 +29,18 @@ public struct ResilientContainer {
56
29
}
57
30
58
31
@inlinable
32
+ @inline ( never)
59
33
public var inlineableProperty : some ExternalP2 {
60
- preventInlining ( )
61
- preventInlining ( )
62
- preventInlining ( )
63
- preventInlining ( )
64
- preventInlining ( )
65
- preventInlining ( )
66
- preventInlining ( )
67
- preventInlining ( )
68
- preventInlining ( )
69
- preventInlining ( )
70
- preventInlining ( )
71
- preventInlining ( )
72
- preventInlining ( )
73
- preventInlining ( )
74
- preventInlining ( )
75
- preventInlining ( )
76
- preventInlining ( )
77
- preventInlining ( )
78
- preventInlining ( )
79
- preventInlining ( )
80
- preventInlining ( )
81
- preventInlining ( )
82
- preventInlining ( )
83
- preventInlining ( )
84
34
return x
85
35
}
86
36
37
+ @_alwaysEmitIntoClient
38
+ @inline ( never)
39
+ public var inlineableProperty2 : some ExternalP2 {
40
+ return x
41
+ }
42
+
43
+
87
44
@inlinable
88
45
public func inlineableContext( ) {
89
46
let x = computedProperty
Original file line number Diff line number Diff line change 1
1
import External2
2
2
3
- @usableFromInline
4
- @inline ( never)
5
- func preventInlining( ) { }
6
-
7
3
// When specializing the opaque result type for this function we should not
8
4
// specialize the opaque result type of the recursive invocation.
9
5
@inlinable
6
+ @inline ( never)
10
7
public func inlinableExternalResilientCallsResilient( ) -> some ExternalP2 {
11
- preventInlining ( )
12
- preventInlining ( )
13
- preventInlining ( )
14
- preventInlining ( )
15
- preventInlining ( )
16
- preventInlining ( )
17
- preventInlining ( )
18
- preventInlining ( )
19
- preventInlining ( )
20
- preventInlining ( )
21
- preventInlining ( )
22
- preventInlining ( )
23
- preventInlining ( )
24
- preventInlining ( )
25
- preventInlining ( )
26
- preventInlining ( )
27
- preventInlining ( )
28
- preventInlining ( )
29
- preventInlining ( )
30
- preventInlining ( )
31
- preventInlining ( )
32
- preventInlining ( )
33
- preventInlining ( )
34
- preventInlining ( )
35
8
return externalResilient ( )
36
9
}
37
10
38
11
// In this case we should look through the recursion.
39
12
@inlinable
13
+ @inline ( never)
40
14
public func inlinableExternalResilientCallsInlinableExternalResilient( ) -> some ExternalP2 {
41
- preventInlining ( )
42
- preventInlining ( )
43
- preventInlining ( )
44
- preventInlining ( )
45
- preventInlining ( )
46
- preventInlining ( )
47
- preventInlining ( )
48
- preventInlining ( )
49
- preventInlining ( )
50
- preventInlining ( )
51
- preventInlining ( )
52
- preventInlining ( )
53
- preventInlining ( )
54
- preventInlining ( )
55
- preventInlining ( )
56
- preventInlining ( )
57
- preventInlining ( )
58
- preventInlining ( )
59
- preventInlining ( )
60
- preventInlining ( )
61
- preventInlining ( )
62
- preventInlining ( )
63
- preventInlining ( )
64
- preventInlining ( )
65
15
return inlinableExternalResilient ( )
66
16
}
67
17
@@ -76,60 +26,14 @@ public struct ResilientContainer2 {
76
26
}
77
27
78
28
@inlinable
29
+ @inline ( never)
79
30
public var inlineableProperty : some ExternalP2 {
80
- preventInlining ( )
81
- preventInlining ( )
82
- preventInlining ( )
83
- preventInlining ( )
84
- preventInlining ( )
85
- preventInlining ( )
86
- preventInlining ( )
87
- preventInlining ( )
88
- preventInlining ( )
89
- preventInlining ( )
90
- preventInlining ( )
91
- preventInlining ( )
92
- preventInlining ( )
93
- preventInlining ( )
94
- preventInlining ( )
95
- preventInlining ( )
96
- preventInlining ( )
97
- preventInlining ( )
98
- preventInlining ( )
99
- preventInlining ( )
100
- preventInlining ( )
101
- preventInlining ( )
102
- preventInlining ( )
103
- preventInlining ( )
104
31
return r. computedProperty
105
32
}
106
33
107
34
@inlinable
35
+ @inline ( never)
108
36
public var inlineablePropertyCallsResilientInlineable : some ExternalP2 {
109
- preventInlining ( )
110
- preventInlining ( )
111
- preventInlining ( )
112
- preventInlining ( )
113
- preventInlining ( )
114
- preventInlining ( )
115
- preventInlining ( )
116
- preventInlining ( )
117
- preventInlining ( )
118
- preventInlining ( )
119
- preventInlining ( )
120
- preventInlining ( )
121
- preventInlining ( )
122
- preventInlining ( )
123
- preventInlining ( )
124
- preventInlining ( )
125
- preventInlining ( )
126
- preventInlining ( )
127
- preventInlining ( )
128
- preventInlining ( )
129
- preventInlining ( )
130
- preventInlining ( )
131
- preventInlining ( )
132
- preventInlining ( )
133
37
return r. inlineableProperty
134
38
}
135
39
}
Original file line number Diff line number Diff line change @@ -337,6 +337,17 @@ public func testResilientInlinableProperty() {
337
337
useP ( r. inlineableProperty. myValue3 ( ) )
338
338
}
339
339
340
+ // CHECK-LABEL: sil @$s1A31testResilientInlinableProperty3yyF
341
+ // CHECK: [[CONTAINER:%.*]] = alloc_stack $ResilientContainer
342
+ // CHECK: [[RES:%.*]] = alloc_stack $Int64
343
+ // CHECK: [[FUN:%.*]] = function_ref @$s9External218ResilientContainerV19inlineableProperty2Qrvg
344
+ // CHECK: [[RES2:%.*]] = unchecked_addr_cast [[RES]] : $*Int64 to $*@_opaqueReturnTypeOf("$s9External218ResilientContainerV19inlineableProperty2Qrvp", 0)
345
+ // CHECK: apply [[FUN]]([[RES2]], [[CONTAINER]])
346
+ public func testResilientInlinableProperty3( ) {
347
+ let r = ResilientContainer ( )
348
+ useP ( r. inlineableProperty2. myValue3 ( ) )
349
+ }
350
+
340
351
// CHECK-LABEL: sil @$s1A22testResilientProperty2yyF
341
352
// CHECK: [[CONTAINER:%.*]] = alloc_stack $ResilientContainer2
342
353
// CHECK: [[RES:%.*]] = alloc_stack $@_opaqueReturnTypeOf("$s9External319ResilientContainer2V16computedPropertyQrvp", 0)
You can’t perform that action at this time.
0 commit comments