File tree Expand file tree Collapse file tree 2 files changed +57
-1
lines changed Expand file tree Collapse file tree 2 files changed +57
-1
lines changed Original file line number Diff line number Diff line change @@ -411,10 +411,28 @@ getTypeRefImpl(IRGenModule &IGM,
411
411
// signal from future runtimes whether they support noncopyable types before
412
412
// exposing their metadata to them.
413
413
Type contextualTy = type;
414
- if (sig)
414
+ if (sig) {
415
415
contextualTy = sig.getGenericEnvironment ()->mapTypeIntoContext (type);
416
+ }
416
417
418
+ bool isAlwaysNoncopyable = false ;
417
419
if (contextualTy->isNoncopyable ()) {
420
+ // If the contextual type has any archetypes in it, it's plausible that
421
+ // we could end up with a copyable type in some instances. Look for those.
422
+ if (contextualTy->hasArchetype ()) {
423
+ // If this is a nominal type, check whether it can ever be copyable.
424
+ if (auto nominal = contextualTy->getAnyNominal ()) {
425
+ if (!nominal->canBeCopyable ())
426
+ isAlwaysNoncopyable = true ;
427
+ } else {
428
+ // Assume that we could end up with a copyable type somehow.
429
+ }
430
+ } else {
431
+ isAlwaysNoncopyable = true ;
432
+ }
433
+ }
434
+
435
+ if (isAlwaysNoncopyable) {
418
436
IGM.IRGen .noteUseOfTypeMetadata (type);
419
437
return getTypeRefByFunction (IGM, sig, type);
420
438
}
Original file line number Diff line number Diff line change
1
+ // RUN: %empty-directory(%t)
2
+ // RUN: %target-swift-frontend -emit-ir -o - %s -module-name test \
3
+ // RUN: -enable-experimental-feature NoncopyableGenerics \
4
+ // RUN: -enable-experimental-feature NonescapableTypes \
5
+ // RUN: -parse-as-library \
6
+ // RUN: -enable-library-evolution \
7
+ // RUN: > %t/test.irgen
8
+
9
+ // RUN: %FileCheck %s < %t/test.irgen
10
+
11
+ @frozen
12
+ public enum ConditionallyCopyable < Wrapped: ~ Copyable> : ~ Copyable {
13
+ case none
14
+ case some( Wrapped )
15
+ }
16
+
17
+ extension ConditionallyCopyable : Copyable where Wrapped: Copyable { }
18
+
19
+ @frozen
20
+ public enum NeverCopyable < Wrapped: ~ Copyable> : ~ Copyable {
21
+ case none
22
+ case some( Wrapped )
23
+ }
24
+
25
+ @frozen
26
+ public struct NonCopyable : ~ Copyable { }
27
+
28
+ // CHECK: @"$s4test1CCMF" =
29
+ // CHECK-SAME: @"symbolic _____yxG 4test21ConditionallyCopyableOAARiczrlE"
30
+ // CHECK-SAME: @"get_type_metadata Riczl4test21ConditionallyCopyableOyAA03NonC0VG.3"
31
+ // CHECK-SAME: @"symbolic _____yxG 4test21ConditionallyCopyableOAARiczrlE"
32
+ // CHECK-SAME: @"get_type_metadata Riczl4test21ConditionallyCopyableOyAA03NonC0VG.3"
33
+ public class C < T: ~ Copyable> {
34
+ var ccT : ConditionallyCopyable < T > = . none
35
+ var ccNC : ConditionallyCopyable < NonCopyable > = . none
36
+ var ncT : ConditionallyCopyable < T > = . none
37
+ var ncNC : ConditionallyCopyable < NonCopyable > = . none
38
+ }
You can’t perform that action at this time.
0 commit comments