Skip to content

Commit ed5c7ef

Browse files
committed
[BitwiseCopyable] Promote to feature.
SE-0426 was accepted.
1 parent fae5d2c commit ed5c7ef

29 files changed

+42
-97
lines changed

include/swift/Basic/Features.def

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -177,6 +177,8 @@ LANGUAGE_FEATURE(BuiltinCreateTask, 0, "Builtin.createTask and Builtin.createDis
177177
SUPPRESSIBLE_LANGUAGE_FEATURE(AssociatedTypeImplements, 0, "@_implements on associated types")
178178
LANGUAGE_FEATURE(BuiltinAddressOfRawLayout, 0, "Builtin.addressOfRawLayout")
179179
LANGUAGE_FEATURE(MoveOnlyPartialConsumption, 429, "Partial consumption of noncopyable values")
180+
/// Enable bitwise-copyable feature.
181+
LANGUAGE_FEATURE(BitwiseCopyable, 426, "BitwiseCopyable protocol")
180182

181183
// Swift 6
182184
UPCOMING_FEATURE(ConciseMagicFile, 274, 6)
@@ -343,9 +345,6 @@ EXPERIMENTAL_FEATURE(StaticExclusiveOnly, true)
343345
/// Enable the @extractConstantsFromMembers attribute.
344346
EXPERIMENTAL_FEATURE(ExtractConstantsFromMembers, false)
345347

346-
/// Enable bitwise-copyable feature.
347-
EXPERIMENTAL_FEATURE(BitwiseCopyable, true)
348-
349348
/// Enable the suppression of inferred, non-invertible, protocols via ~.
350349
SUPPRESSIBLE_EXPERIMENTAL_FEATURE(ConformanceSuppression, true)
351350

lib/AST/LifetimeDependence.cpp

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -173,9 +173,6 @@ static LifetimeDependenceKind getLifetimeDependenceKindFromDecl(
173173
}
174174

175175
static bool isBitwiseCopyable(Type type, ModuleDecl *mod, ASTContext &ctx) {
176-
if (!ctx.LangOpts.hasFeature(Feature::BitwiseCopyable)) {
177-
return false;
178-
}
179176
auto *bitwiseCopyableProtocol =
180177
ctx.getProtocol(KnownProtocolKind::BitwiseCopyable);
181178
if (!bitwiseCopyableProtocol) {

lib/AST/ProtocolConformance.cpp

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1284,10 +1284,7 @@ static SmallVector<ProtocolConformance *, 2> findSynthesizedConformances(
12841284
for (auto ip : InvertibleProtocolSet::allKnown())
12851285
trySynthesize(getKnownProtocolKind(ip));
12861286

1287-
if (nominal->getASTContext().LangOpts.hasFeature(
1288-
Feature::BitwiseCopyable)) {
1289-
trySynthesize(KnownProtocolKind::BitwiseCopyable);
1290-
}
1287+
trySynthesize(KnownProtocolKind::BitwiseCopyable);
12911288
}
12921289

12931290
/// Distributed actors can synthesize Encodable/Decodable, so look for those

lib/ClangImporter/ImportDecl.cpp

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8029,8 +8029,6 @@ ClangImporter::Implementation::importSwiftAttrAttributes(Decl *MappedDecl) {
80298029
}
80308030

80318031
if (swiftAttr->getAttribute() == "_BitwiseCopyable") {
8032-
if (!SwiftContext.LangOpts.hasFeature(Feature::BitwiseCopyable))
8033-
continue;
80348032
auto *protocol =
80358033
SwiftContext.getProtocol(KnownProtocolKind::BitwiseCopyable);
80368034
auto *nominal = dyn_cast<NominalTypeDecl>(MappedDecl);

lib/SIL/IR/TypeLowering.cpp

Lines changed: 26 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
#include "swift/AST/DiagnosticEngine.h"
2121
#include "swift/AST/DiagnosticsSIL.h"
2222
#include "swift/AST/Expr.h"
23+
#include "swift/AST/FileUnit.h"
2324
#include "swift/AST/GenericEnvironment.h"
2425
#include "swift/AST/LazyResolver.h"
2526
#include "swift/AST/Module.h"
@@ -28,6 +29,7 @@
2829
#include "swift/AST/Pattern.h"
2930
#include "swift/AST/PrettyStackTrace.h"
3031
#include "swift/AST/PropertyWrappers.h"
32+
#include "swift/AST/SourceFile.h"
3133
#include "swift/AST/TypeDifferenceVisitor.h"
3234
#include "swift/AST/Types.h"
3335
#include "swift/ClangImporter/ClangModule.h"
@@ -3041,8 +3043,6 @@ void TypeConverter::verifyTrivialLowering(const TypeLowering &lowering,
30413043
AbstractionPattern origType,
30423044
CanType substType,
30433045
TypeExpansionContext forExpansion) {
3044-
if (!Context.LangOpts.hasFeature(Feature::BitwiseCopyable))
3045-
return;
30463046
auto *bitwiseCopyableProtocol =
30473047
Context.getProtocol(KnownProtocolKind::BitwiseCopyable);
30483048
if (!bitwiseCopyableProtocol)
@@ -3057,10 +3057,20 @@ void TypeConverter::verifyTrivialLowering(const TypeLowering &lowering,
30573057

30583058
if (auto *nominal = substType.getAnyNominal()) {
30593059
auto *module = nominal->getModuleContext();
3060-
if (module && module->isBuiltFromInterface()) {
3061-
// Don't verify for types in modules built from interfaces; the feature
3062-
// may not have been enabled in them.
3063-
return;
3060+
if (module) {
3061+
if (module->isBuiltFromInterface()) {
3062+
// Don't verify for types in modules built from interfaces; the feature
3063+
// may not have been enabled in them.
3064+
return;
3065+
}
3066+
auto *file = dyn_cast_or_null<FileUnit>(module->getModuleScopeContext());
3067+
if (file && file->getKind() == FileUnitKind::Source) {
3068+
auto sourceFile = nominal->getParentSourceFile();
3069+
if (sourceFile && sourceFile->Kind == SourceFileKind::SIL) {
3070+
// Don't verify for types in SIL files.
3071+
return;
3072+
}
3073+
}
30643074
}
30653075
}
30663076

@@ -3086,6 +3096,7 @@ void TypeConverter::verifyTrivialLowering(const TypeLowering &lowering,
30863096
// unconditionally but does in this case
30873097
// (8) being or containing the error type
30883098
// (9) explicitly suppressing conformance
3099+
// (10) a layout constrained archetype
30893100
bool hasNoNonconformingNode = visitAggregateLeaves(
30903101
origType, substType, forExpansion,
30913102
/*isLeafAggregate=*/
@@ -3155,7 +3166,7 @@ void TypeConverter::verifyTrivialLowering(const TypeLowering &lowering,
31553166

31563167
// ModuleTypes are trivial but don't warrant being given a
31573168
// conformance to BitwiseCopyable (case (3)).
3158-
if (isa<ModuleType, SILTokenType>(ty)) {
3169+
if (isa<ModuleType>(ty) || isa<SILTokenType>(ty)) {
31593170
// These types should never appear within aggregates.
31603171
assert(isTopLevel && "aggregate containing marker type!?");
31613172
// If they did, though, they would not justify the aggregate's
@@ -3174,6 +3185,14 @@ void TypeConverter::verifyTrivialLowering(const TypeLowering &lowering,
31743185
return !isTopLevel;
31753186
}
31763187

3188+
// Case (10): a layout-constrained archetype.
3189+
if (auto archetype = dyn_cast<ArchetypeType>(ty)) {
3190+
auto constraint = archetype->getLayoutConstraint();
3191+
if (constraint && constraint->isTrivial()) {
3192+
return false;
3193+
}
3194+
}
3195+
31773196
auto *nominal = ty.getAnyNominal();
31783197

31793198
// Non-nominal types (besides case (3) handled above) are trivial iff

lib/Sema/TypeCheckDecl.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -682,9 +682,9 @@ ExistentialConformsToSelfRequest::evaluate(Evaluator &evaluator,
682682
ProtocolDecl *decl) const {
683683
// Marker protocols always self-conform.
684684
if (decl->isMarkerProtocol()) {
685-
// Except for BitwiseCopyable an existential of which is non-trivial.
686-
if (decl->getASTContext().LangOpts.hasFeature(Feature::BitwiseCopyable) &&
687-
decl->getKnownProtocolKind() == KnownProtocolKind::BitwiseCopyable) {
685+
// Except for BitwiseCopyable an existential of which is not bitwise
686+
// copyable.
687+
if (decl->getKnownProtocolKind() == KnownProtocolKind::BitwiseCopyable) {
688688
return false;
689689
}
690690
return true;

lib/Sema/TypeCheckProtocol.cpp

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6117,11 +6117,9 @@ void TypeChecker::checkConformancesInContext(IterableDeclContext *idc) {
61176117
break;
61186118
}
61196119
case KnownProtocolKind::BitwiseCopyable: {
6120-
if (Context.LangOpts.hasFeature(Feature::BitwiseCopyable)) {
6121-
checkBitwiseCopyableConformance(
6122-
conformance, /*isImplicit=*/conformance->getSourceKind() ==
6123-
ConformanceEntryKind::Synthesized);
6124-
}
6120+
checkBitwiseCopyableConformance(
6121+
conformance, /*isImplicit=*/conformance->getSourceKind() ==
6122+
ConformanceEntryKind::Synthesized);
61256123
break;
61266124
}
61276125
default:

stdlib/public/core/CMakeLists.txt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -315,7 +315,6 @@ list(APPEND swift_stdlib_compile_flags "-Xfrontend" "-enable-experimental-concis
315315
list(APPEND swift_stdlib_compile_flags "-enable-experimental-feature" "Macros")
316316
list(APPEND swift_stdlib_compile_flags "-enable-experimental-feature" "FreestandingMacros")
317317
list(APPEND swift_stdlib_compile_flags "-enable-experimental-feature" "Extern")
318-
list(APPEND swift_stdlib_compile_flags "-enable-experimental-feature" "BitwiseCopyable")
319318
list(APPEND swift_stdlib_compile_flags "-enable-experimental-feature" "BorrowingSwitch")
320319
list(APPEND swift_stdlib_compile_flags "-enable-experimental-feature" "ConformanceSuppression")
321320

test/Frontend/bitwise-copyable-flag.swift

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
// RUN: %target-swift-frontend \
2-
// RUN: -enable-experimental-feature BitwiseCopyable \
32
// RUN: %s \
43
// RUN: -typecheck -verify
54

test/IRGen/bitwise-copyable-derived-loadRaw.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// RUN: %target-run-simple-swift(-Xfrontend -sil-verify-all -enable-experimental-feature BuiltinModule -enable-experimental-feature BitwiseCopyable) | %FileCheck %s
1+
// RUN: %target-run-simple-swift(-Xfrontend -sil-verify-all -enable-experimental-feature BuiltinModule) | %FileCheck %s
22

33
// REQUIRES: executable_test
44

0 commit comments

Comments
 (0)