Skip to content

Commit f7c6c99

Browse files
committed
AST: Remove generic signature and conditional requirements from BuiltinProtocolConformance
1 parent 7602b3d commit f7c6c99

File tree

9 files changed

+30
-110
lines changed

9 files changed

+30
-110
lines changed

include/swift/AST/ASTContext.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1276,8 +1276,6 @@ class ASTContext final {
12761276
/// Produce the builtin conformance for some structural type to some protocol.
12771277
BuiltinProtocolConformance *
12781278
getBuiltinConformance(Type type, ProtocolDecl *protocol,
1279-
GenericSignature genericSig,
1280-
ArrayRef<Requirement> conditionalRequirements,
12811279
BuiltinConformanceKind kind);
12821280

12831281
/// A callback used to produce a diagnostic for an ill-formed protocol

include/swift/AST/ProtocolConformance.h

Lines changed: 8 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1019,23 +1019,13 @@ enum class BuiltinConformanceKind {
10191019

10201020
/// A builtin conformance appears when a non-nominal type has a
10211021
/// conformance that is synthesized by the implementation.
1022-
class BuiltinProtocolConformance final : public RootProtocolConformance,
1023-
private llvm::TrailingObjects<BuiltinProtocolConformance, Requirement> {
1022+
class BuiltinProtocolConformance final : public RootProtocolConformance {
10241023
friend ASTContext;
1025-
friend TrailingObjects;
10261024

10271025
ProtocolDecl *protocol;
1028-
GenericSignature genericSig;
1029-
size_t numConditionalRequirements : 31;
1030-
unsigned builtinConformanceKind : 1;
1031-
1032-
size_t numTrailingObjects(OverloadToken<Requirement>) const {
1033-
return numConditionalRequirements;
1034-
}
1026+
unsigned builtinConformanceKind;
10351027

10361028
BuiltinProtocolConformance(Type conformingType, ProtocolDecl *protocol,
1037-
GenericSignature genericSig,
1038-
ArrayRef<Requirement> conditionalRequirements,
10391029
BuiltinConformanceKind kind);
10401030

10411031
public:
@@ -1044,16 +1034,14 @@ class BuiltinProtocolConformance final : public RootProtocolConformance,
10441034
return protocol;
10451035
}
10461036

1047-
/// Retrieve the generic signature that describes the type parameters used
1048-
/// within the conforming type.
1049-
GenericSignature getGenericSignature() const {
1050-
return genericSig;
1051-
}
1052-
10531037
BuiltinConformanceKind getBuiltinConformanceKind() const {
10541038
return static_cast<BuiltinConformanceKind>(builtinConformanceKind);
10551039
}
10561040

1041+
GenericSignature getGenericSignature() const {
1042+
return GenericSignature();
1043+
}
1044+
10571045
/// Whether this represents a "missing" conformance that should be diagnosed
10581046
/// later.
10591047
bool isMissing() const {
@@ -1063,12 +1051,12 @@ class BuiltinProtocolConformance final : public RootProtocolConformance,
10631051
/// Get any requirements that must be satisfied for this conformance to apply.
10641052
llvm::Optional<ArrayRef<Requirement>>
10651053
getConditionalRequirementsIfAvailable() const {
1066-
return getConditionalRequirements();
1054+
return ArrayRef<Requirement>();
10671055
}
10681056

10691057
/// Get any requirements that must be satisfied for this conformance to apply.
10701058
ArrayRef<Requirement> getConditionalRequirements() const {
1071-
return {getTrailingObjects<Requirement>(), numConditionalRequirements};
1059+
return {};
10721060
}
10731061

10741062
/// Get the declaration context that contains the nominal type declaration.

lib/AST/ASTContext.cpp

Lines changed: 3 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2681,23 +2681,15 @@ ASTContext::getSelfConformance(ProtocolDecl *protocol) {
26812681

26822682
/// Produce the builtin conformance for some non-nominal to some protocol.
26832683
BuiltinProtocolConformance *
2684-
ASTContext::getBuiltinConformance(
2685-
Type type, ProtocolDecl *protocol,
2686-
GenericSignature genericSig,
2687-
ArrayRef<Requirement> conditionalRequirements,
2688-
BuiltinConformanceKind kind
2689-
) {
2684+
ASTContext::getBuiltinConformance(Type type, ProtocolDecl *protocol,
2685+
BuiltinConformanceKind kind) {
26902686
auto key = std::make_pair(type, protocol);
26912687
AllocationArena arena = getArena(type->getRecursiveProperties());
26922688
auto &builtinConformances = getImpl().getArena(arena).BuiltinConformances;
26932689

26942690
auto &entry = builtinConformances[key];
26952691
if (!entry) {
2696-
auto size = BuiltinProtocolConformance::
2697-
totalSizeToAlloc<Requirement>(conditionalRequirements.size());
2698-
auto mem = this->Allocate(size, alignof(BuiltinProtocolConformance), arena);
2699-
entry = new (mem) BuiltinProtocolConformance(
2700-
type, protocol, genericSig, conditionalRequirements, kind);
2692+
entry = new (*this) BuiltinProtocolConformance(type, protocol, kind);
27012693
}
27022694
return entry;
27032695
}

lib/AST/Module.cpp

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1588,7 +1588,7 @@ ModuleDecl::lookupExistentialConformance(Type type, ProtocolDecl *protocol) {
15881588
// All existentials are Copyable.
15891589
if (protocol->isSpecificProtocol(KnownProtocolKind::Copyable)) {
15901590
return ProtocolConformanceRef(
1591-
ctx.getBuiltinConformance(type, protocol, GenericSignature(), {},
1591+
ctx.getBuiltinConformance(type, protocol,
15921592
BuiltinConformanceKind::Synthesized));
15931593
}
15941594

@@ -1670,8 +1670,7 @@ ProtocolConformanceRef ProtocolConformanceRef::forMissingOrInvalid(
16701670
if (shouldCreateMissingConformances(type, proto)) {
16711671
return ProtocolConformanceRef(
16721672
ctx.getBuiltinConformance(
1673-
type, proto, GenericSignature(), { },
1674-
BuiltinConformanceKind::Missing));
1673+
type, proto, BuiltinConformanceKind::Missing));
16751674
}
16761675

16771676
return ProtocolConformanceRef::forInvalid();
@@ -1774,15 +1773,15 @@ static ProtocolConformanceRef getBuiltinFunctionTypeConformance(
17741773
if (protocol->isSpecificProtocol(KnownProtocolKind::Sendable) &&
17751774
isSendableFunctionType(functionType)) {
17761775
return ProtocolConformanceRef(
1777-
ctx.getBuiltinConformance(type, protocol, GenericSignature(), { },
1776+
ctx.getBuiltinConformance(type, protocol,
17781777
BuiltinConformanceKind::Synthesized));
17791778
}
17801779

17811780
// Functions cannot permanently destroy a move-only var/let
17821781
// that they capture, so it's safe to copy functions, like classes.
17831782
if (protocol->isSpecificProtocol(KnownProtocolKind::Copyable)) {
17841783
return ProtocolConformanceRef(
1785-
ctx.getBuiltinConformance(type, protocol, GenericSignature(), {},
1784+
ctx.getBuiltinConformance(type, protocol,
17861785
BuiltinConformanceKind::Synthesized));
17871786
}
17881787

@@ -1799,14 +1798,14 @@ static ProtocolConformanceRef getBuiltinMetaTypeTypeConformance(
17991798
if (protocol->isSpecificProtocol(KnownProtocolKind::Copyable) &&
18001799
!metatypeType->getInstanceType()->isPureMoveOnly()) {
18011800
return ProtocolConformanceRef(
1802-
ctx.getBuiltinConformance(type, protocol, GenericSignature(), { },
1801+
ctx.getBuiltinConformance(type, protocol,
18031802
BuiltinConformanceKind::Synthesized));
18041803
}
18051804

18061805
// All metatypes are Sendable
18071806
if (protocol->isSpecificProtocol(KnownProtocolKind::Sendable)) {
18081807
return ProtocolConformanceRef(
1809-
ctx.getBuiltinConformance(type, protocol, GenericSignature(), { },
1808+
ctx.getBuiltinConformance(type, protocol,
18101809
BuiltinConformanceKind::Synthesized));
18111810
}
18121811

@@ -1822,7 +1821,7 @@ static ProtocolConformanceRef getBuiltinBuiltinTypeConformance(
18221821
protocol->isSpecificProtocol(KnownProtocolKind::Copyable)) {
18231822
ASTContext &ctx = protocol->getASTContext();
18241823
return ProtocolConformanceRef(
1825-
ctx.getBuiltinConformance(type, protocol, GenericSignature(), { },
1824+
ctx.getBuiltinConformance(type, protocol,
18261825
BuiltinConformanceKind::Synthesized));
18271826
}
18281827

@@ -1951,6 +1950,7 @@ LookupConformanceInModuleRequest::evaluate(
19511950
}
19521951

19531952
// Specific handling of Copyable and Sendable for pack expansions.
1953+
// FIXME: Remove.
19541954
if (auto packExpansion = type->getAs<PackExpansionType>()) {
19551955
if (protocol->isSpecificProtocol(KnownProtocolKind::Copyable) ||
19561956
protocol->isSpecificProtocol(KnownProtocolKind::Sendable)) {

lib/AST/ProtocolConformance.cpp

Lines changed: 4 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -967,18 +967,11 @@ ProtocolConformance::subst(InFlightSubstitution &IFS) const {
967967
if (substType.getPointer() == origType.getPointer())
968968
return const_cast<ProtocolConformance *>(this);
969969

970-
SmallVector<Requirement, 2> requirements;
971-
for (auto req : getConditionalRequirements()) {
972-
requirements.push_back(req.subst(IFS));
973-
}
974-
975970
auto kind = cast<BuiltinProtocolConformance>(this)
976971
->getBuiltinConformanceKind();
977972

978973
return substType->getASTContext()
979-
.getBuiltinConformance(substType,
980-
getProtocol(), getGenericSignature(),
981-
requirements, kind);
974+
.getBuiltinConformance(substType, getProtocol(), kind);
982975
}
983976
case ProtocolConformanceKind::Self:
984977
return const_cast<ProtocolConformance*>(this);
@@ -1410,18 +1403,7 @@ bool ProtocolConformance::isCanonical() const {
14101403
return true;
14111404
}
14121405
case ProtocolConformanceKind::Builtin: {
1413-
// Check that the generic signature of the conformance is canonical.
1414-
auto builtinConformance = cast<BuiltinProtocolConformance>(this);
1415-
if (builtinConformance->getGenericSignature()
1416-
&& !builtinConformance->getGenericSignature()->isCanonical()) {
1417-
return false;
1418-
}
1419-
// Check that the satisfied conditional requirements are canonical.
1420-
for (auto &requirement : builtinConformance->getConditionalRequirements()) {
1421-
if (!requirement.isCanonical()) {
1422-
return false;
1423-
}
1424-
}
1406+
// FIXME: Not the conforming type?
14251407
return true;
14261408
}
14271409
case ProtocolConformanceKind::Inherited: {
@@ -1458,15 +1440,9 @@ ProtocolConformance *ProtocolConformance::getCanonicalConformance() {
14581440
// Canonicalize the subject type of the builtin conformance.
14591441
auto &Ctx = getType()->getASTContext();
14601442
auto builtinConformance = cast<BuiltinProtocolConformance>(this);
1461-
SmallVector<Requirement, 4> canonicalRequirements;
1462-
for (auto &reqt : builtinConformance->getConditionalRequirements()) {
1463-
canonicalRequirements.push_back(reqt.getCanonical());
1464-
}
14651443
return Ctx.getBuiltinConformance(
14661444
builtinConformance->getType()->getCanonicalType(),
14671445
builtinConformance->getProtocol(),
1468-
builtinConformance->getGenericSignature().getCanonicalSignature(),
1469-
canonicalRequirements,
14701446
builtinConformance->getBuiltinConformanceKind());
14711447
}
14721448

@@ -1496,18 +1472,10 @@ ProtocolConformance *ProtocolConformance::getCanonicalConformance() {
14961472

14971473
BuiltinProtocolConformance::BuiltinProtocolConformance(
14981474
Type conformingType, ProtocolDecl *protocol,
1499-
GenericSignature genericSig,
1500-
ArrayRef<Requirement> conditionalRequirements,
15011475
BuiltinConformanceKind kind
15021476
) : RootProtocolConformance(ProtocolConformanceKind::Builtin, conformingType),
1503-
protocol(protocol), genericSig(genericSig),
1504-
numConditionalRequirements(conditionalRequirements.size()),
1505-
builtinConformanceKind(static_cast<unsigned>(kind))
1506-
{
1507-
std::uninitialized_copy(conditionalRequirements.begin(),
1508-
conditionalRequirements.end(),
1509-
getTrailingObjects<Requirement>());
1510-
}
1477+
protocol(protocol), builtinConformanceKind(static_cast<unsigned>(kind))
1478+
{}
15111479

15121480
// See swift/Basic/Statistic.h for declaration: this enables tracing
15131481
// ProtocolConformances, is defined here to avoid too much layering violation /

lib/Sema/TypeCheckProtocol.cpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5700,8 +5700,7 @@ TypeChecker::containsProtocol(Type T, ProtocolDecl *Proto, ModuleDecl *M,
57005700
Proto->isSpecificProtocol(KnownProtocolKind::Sendable)) {
57015701
return ProtocolConformanceRef(
57025702
M->getASTContext().getBuiltinConformance(
5703-
T, Proto, GenericSignature(), { },
5704-
BuiltinConformanceKind::Missing));
5703+
T, Proto, BuiltinConformanceKind::Missing));
57055704
}
57065705

57075706
return ProtocolConformanceRef::forInvalid();

lib/Serialization/Deserialization.cpp

Lines changed: 2 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -844,13 +844,9 @@ ProtocolConformanceDeserializer::readBuiltinProtocolConformance(
844844

845845
TypeID conformingTypeID;
846846
DeclID protoID;
847-
GenericSignatureID genericSigID;
848847
unsigned builtinConformanceKind;
849-
ArrayRef<uint64_t> data;
850848
BuiltinProtocolConformanceLayout::readRecord(scratch, conformingTypeID,
851-
protoID, genericSigID,
852-
builtinConformanceKind,
853-
data);
849+
protoID, builtinConformanceKind);
854850

855851
Type conformingType = MF.getType(conformingTypeID);
856852

@@ -859,22 +855,9 @@ ProtocolConformanceDeserializer::readBuiltinProtocolConformance(
859855
return decl.takeError();
860856

861857
auto proto = cast<ProtocolDecl>(decl.get());
862-
auto genericSig = MF.getGenericSignatureChecked(genericSigID);
863-
if (!genericSig)
864-
return genericSig.takeError();
865-
866-
// Read the conditional requirements.
867-
SmallVector<Requirement, 4> conditionalRequirements;
868-
unsigned nextDataIndex = 0;
869-
auto error = MF.deserializeGenericRequirementsChecked(
870-
data, nextDataIndex, conditionalRequirements);
871-
if (error)
872-
return std::move(error);
873-
if (nextDataIndex != data.size())
874-
return MF.diagnoseFatal();
875858

876859
auto conformance = ctx.getBuiltinConformance(
877-
conformingType, proto, *genericSig, conditionalRequirements,
860+
conformingType, proto,
878861
static_cast<BuiltinConformanceKind>(builtinConformanceKind));
879862
return conformance;
880863
}

lib/Serialization/ModuleFormat.h

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ const uint16_t SWIFTMODULE_VERSION_MAJOR = 0;
5858
/// describe what change you made. The content of this comment isn't important;
5959
/// it just ensures a conflict if two people change the module format.
6060
/// Don't worry about adhering to the 80-column limit for this line.
61-
const uint16_t SWIFTMODULE_VERSION_MINOR = 797; // checked_cast_br takes a formal type
61+
const uint16_t SWIFTMODULE_VERSION_MINOR = 798; // removing builtin tuple conformances
6262

6363
/// A standard hash seed used for all string hashes in a serialized module.
6464
///
@@ -1951,9 +1951,7 @@ namespace decls_block {
19511951
BUILTIN_PROTOCOL_CONFORMANCE,
19521952
TypeIDField, // the conforming type
19531953
DeclIDField, // the protocol
1954-
GenericSignatureIDField, // the generic signature
1955-
BCFixed<2>, // the builtin conformance kind
1956-
BCArray<BCVBR<6>> // conditional requirements
1954+
BCFixed<2> // the builtin conformance kind
19571955
>;
19581956

19591957
using PackConformanceLayout = BCRecordLayout<

lib/Serialization/Serialization.cpp

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1842,16 +1842,10 @@ Serializer::writeASTBlockEntity(ProtocolConformance *conformance) {
18421842
DeclTypeAbbrCodes[BuiltinProtocolConformanceLayout::Code];
18431843
auto typeID = addTypeRef(builtin->getType());
18441844
auto protocolID = addDeclRef(builtin->getProtocol());
1845-
auto genericSigID = addGenericSignatureRef(builtin->getGenericSignature());
1846-
1847-
SmallVector<uint64_t, 16> requirementData;
1848-
serializeGenericRequirements(builtin->getConditionalRequirements(),
1849-
requirementData);
18501845

18511846
BuiltinProtocolConformanceLayout::emitRecord(
1852-
Out, ScratchRecord, abbrCode, typeID, protocolID, genericSigID,
1853-
static_cast<unsigned>(builtin->getBuiltinConformanceKind()),
1854-
requirementData);
1847+
Out, ScratchRecord, abbrCode, typeID, protocolID,
1848+
static_cast<unsigned>(builtin->getBuiltinConformanceKind()));
18551849
break;
18561850
}
18571851
}

0 commit comments

Comments
 (0)