Skip to content

Commit 187f434

Browse files
committed
[BitwiseCopyable] Uniform inference for non-frozen
Don't key inference behavior off of library evolution mode.
1 parent 3b0a13a commit 187f434

File tree

5 files changed

+21
-13
lines changed

5 files changed

+21
-13
lines changed

lib/SIL/IR/TypeLowering.cpp

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3049,7 +3049,7 @@ void TypeConverter::verifyTrivialLowering(const TypeLowering &lowering,
30493049

30503050
if (lowering.isTrivial() && !conformance) {
30513051
// A trivial type can lack a conformance in a few cases:
3052-
// (1) containing or being a resilient type
3052+
// (1) containing or being a public, non-frozen type
30533053
// (2) containing or being a generic type which doesn't conform
30543054
// unconditionally but in this particular instantiation is trivial
30553055
// (3) being a special type that's not worth forming a conformance for
@@ -3082,8 +3082,11 @@ void TypeConverter::verifyTrivialLowering(const TypeLowering &lowering,
30823082
return true;
30833083
}
30843084

3085-
// Resilient trivial types may not conform (case (1)).
3086-
if (nominal->isResilient())
3085+
// Public, non-frozen trivial types may not conform (case (1)).
3086+
if (nominal
3087+
->getFormalAccessScope(/*useDC=*/nullptr,
3088+
/*treatUsableFromInlineAsPublic=*/true)
3089+
.isPublic())
30873090
return true;
30883091

30893092
auto *module = nominal->getModuleContext();
@@ -3149,8 +3152,11 @@ void TypeConverter::verifyTrivialLowering(const TypeLowering &lowering,
31493152
return false;
31503153
}
31513154

3152-
// Resilient trivial types may not conform (case (1)).
3153-
if (nominal->isResilient())
3155+
// Public, non-frozen trivial types may not conform (case (1)).
3156+
if (nominal
3157+
->getFormalAccessScope(/*useDC=*/nullptr,
3158+
/*treatUsableFromInlineAsPublic=*/true)
3159+
.isPublic())
31543160
return false;
31553161

31563162
auto *module = nominal->getModuleContext();

lib/Sema/TypeCheckBitwise.cpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -57,8 +57,7 @@ getImplicitCheckForNominal(NominalTypeDecl *nominal) {
5757
if (!nominal
5858
->getFormalAccessScope(
5959
/*useDC=*/nullptr, /*treatUsableFromInlineAsPublic=*/true)
60-
.isPublic() ||
61-
!nominal->isResilient())
60+
.isPublic())
6261
return {BitwiseCopyableCheck::Implicit};
6362

6463
if (nominal->hasClangNode() ||

test/SILGen/bitwise_copyable.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ enum Context<T> {
4040

4141
func doit() -> Context<Int>.Here { .init(t: 0) }
4242

43-
public enum E {
43+
public enum E : _BitwiseCopyable {
4444
case a
4545
}
4646

test/Sema/bitwise_copyable.swift

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,8 @@ struct S_Explicit_With_Function_C : _BitwiseCopyable {
6262
public struct S_Public {}
6363

6464
struct S_Explicit_With_S_Public : _BitwiseCopyable {
65-
var s: S_Public
65+
var s: S_Public // expected-error {{non_bitwise_copyable_type_member}}
66+
// expected-note@-4 {{add_nominal_bitwise_copyable_conformance}}
6667
}
6768

6869
struct S_Explicit_With_Generic<T> : _BitwiseCopyable {

test/Sema/bitwise_copyable_nonresilient.swift

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -32,15 +32,17 @@ import Library
3232
func take<T: _BitwiseCopyable>(_ t: T) {}
3333

3434
struct S_Explicit_With_Oopsional<T> : _BitwiseCopyable {
35-
var o: Oopsional<T>
35+
var o: Oopsional<T> // expected-error{{non_bitwise_copyable_type_member}}
3636
}
3737

38-
func passOopsional<T>(_ t: Oopsional<T>) { take(t) }
38+
func passOopsional<T>(_ t: Oopsional<T>) { take(t) } // expected-error{{type_does_not_conform_decl_owner}}
39+
// expected-note@-7{{where_requirement_failure_one_subst}}
3940

4041

4142
struct S_Explicit_With_Woopsional<T> : _BitwiseCopyable {
42-
var o: Woopsional<T>
43+
var o: Woopsional<T> // expected-error{{non_bitwise_copyable_type_member}}
4344
}
4445

45-
func passWoopsional<T>(_ t: Woopsional<T>) { take(t) }
46+
func passWoopsional<T>(_ t: Woopsional<T>) { take(t) } // expected-error{{type_does_not_conform_decl_owner}}
47+
// expected-note@-15{{where_requirement_failure_one_subst}}
4648

0 commit comments

Comments
 (0)