Skip to content

Commit 6a3ead3

Browse files
authored
Merge pull request #80107 from slavapestov/for-abstract-conformance
Fix a few more callers of ProtocolConformanceRef::forAbstract() to pass in a subject type
2 parents c28279f + 9c657e4 commit 6a3ead3

26 files changed

+183
-127
lines changed

SwiftCompilerSources/Sources/AST/Conformance.swift

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,9 @@ public struct Conformance: CustomStringConvertible, NoReflectionChildren {
3737
return Type(bridged: bridged.getType())
3838
}
3939

40+
public var proto: ProtocolDecl {
41+
return bridged.getRequirement().getAs(ProtocolDecl.self)
42+
}
4043
public var isSpecialized: Bool {
4144
assert(isConcrete)
4245
return bridged.isSpecializedConformance()

SwiftCompilerSources/Sources/Optimizer/Utilities/GenericSpecialization.swift

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -144,14 +144,17 @@ func specializeWitnessTable(forConformance conformance: Conformance,
144144
case .associatedType(let requirement, let witness):
145145
let substType = witness.subst(with: conformance.specializedSubstitutions)
146146
return .associatedType(requirement: requirement, witness: substType)
147-
case .associatedConformance(let requirement, let proto, _):
148-
let concreteAssociateConf = conformance.getAssociatedConformance(ofAssociatedType: requirement.rawType, to: proto)
147+
case .associatedConformance(let requirement, let substType, let assocConf):
148+
// FIXME: let concreteAssociateConf = assocConf.subst(with: conformance.specializedSubstitutions)
149+
let concreteAssociateConf = conformance.getAssociatedConformance(ofAssociatedType: requirement.rawType, to: assocConf.proto)
149150
if concreteAssociateConf.isSpecialized {
150151
specializeWitnessTable(forConformance: concreteAssociateConf,
151152
errorLocation: errorLocation,
152153
context, notifyNewWitnessTable)
153154
}
154-
return .associatedConformance(requirement: requirement, protocol: proto, witness: concreteAssociateConf)
155+
return .associatedConformance(requirement: requirement,
156+
substType: substType.subst(with: conformance.specializedSubstitutions),
157+
witness: concreteAssociateConf)
155158
}
156159
}
157160
let newWT = context.createWitnessTable(entries: newEntries,conformance: conformance,

SwiftCompilerSources/Sources/SIL/WitnessTable.swift

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ public struct WitnessTable : CustomStringConvertible, NoReflectionChildren {
3131
case associatedType(requirement: AssociatedTypeDecl, witness: CanonicalType)
3232

3333
/// A witness table entry describing the witness for an associated type's protocol requirement.
34-
case associatedConformance(requirement: CanonicalType, protocol: ProtocolDecl, witness: Conformance)
34+
case associatedConformance(requirement: CanonicalType, substType: CanonicalType, witness: Conformance)
3535

3636
/// A witness table entry referencing the protocol conformance for a refined base protocol.
3737
case baseProtocol(requirement: ProtocolDecl, witness: Conformance)
@@ -48,7 +48,7 @@ public struct WitnessTable : CustomStringConvertible, NoReflectionChildren {
4848
witness: CanonicalType(bridged: bridged.getAssociatedTypeWitness()))
4949
case .associatedConformance:
5050
self = .associatedConformance(requirement: CanonicalType(bridged: bridged.getAssociatedConformanceRequirement()),
51-
protocol: bridged.getAssociatedConformanceDecl().getAs(ProtocolDecl.self),
51+
substType: CanonicalType(bridged: bridged.getAssociatedConformanceSubstType()),
5252
witness: Conformance(bridged: bridged.getAssociatedConformanceWitness()))
5353
case .baseProtocol:
5454
self = .baseProtocol(requirement: bridged.getBaseProtocolRequirement().getAs(ProtocolDecl.self),
@@ -71,9 +71,9 @@ public struct WitnessTable : CustomStringConvertible, NoReflectionChildren {
7171
OptionalBridgedFunction(obj: witness?.bridged.obj))
7272
case .associatedType(let requirement, let witness):
7373
return BridgedWitnessTableEntry.createAssociatedType(requirement.bridged, witness.bridged)
74-
case .associatedConformance(let requirement, let protocolDecl, let witness):
74+
case .associatedConformance(let requirement, let substType, let witness):
7575
return BridgedWitnessTableEntry.createAssociatedConformance(requirement.bridged,
76-
protocolDecl.bridged,
76+
substType.bridged,
7777
witness.bridged)
7878
case .baseProtocol(let requirement, let witness):
7979
return BridgedWitnessTableEntry.createBaseProtocol(requirement.bridged, witness.bridged)

include/swift/AST/ASTBridging.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3110,6 +3110,7 @@ struct BridgedConformance {
31103110
BRIDGED_INLINE bool isSpecializedConformance() const;
31113111
BRIDGED_INLINE bool isInheritedConformance() const;
31123112
SWIFT_IMPORT_UNSAFE BRIDGED_INLINE BridgedASTType getType() const;
3113+
SWIFT_IMPORT_UNSAFE BRIDGED_INLINE BridgedDeclObj getRequirement() const;
31133114
SWIFT_IMPORT_UNSAFE BRIDGED_INLINE BridgedConformance getGenericConformance() const;
31143115
SWIFT_IMPORT_UNSAFE BRIDGED_INLINE BridgedConformance getInheritedConformance() const;
31153116
SWIFT_IMPORT_UNSAFE BRIDGED_INLINE BridgedSubstitutionMap getSpecializedSubstitutions() const;

include/swift/AST/ASTBridgingImpl.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -601,6 +601,10 @@ BridgedASTType BridgedConformance::getType() const {
601601
return {unbridged().getConcrete()->getType().getPointer()};
602602
}
603603

604+
BridgedDeclObj BridgedConformance::getRequirement() const {
605+
return {unbridged().getRequirement()};
606+
}
607+
604608
BridgedConformance BridgedConformance::getGenericConformance() const {
605609
auto *specPC = swift::cast<swift::SpecializedProtocolConformance>(unbridged().getConcrete());
606610
return {swift::ProtocolConformanceRef(specPC->getGenericConformance())};

include/swift/AST/ProtocolConformanceRef.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
#include "swift/AST/ProtocolConformanceRef.h"
2020
#include "swift/AST/Type.h"
2121
#include "swift/AST/TypeAlignments.h"
22+
#include "swift/Basic/Assertions.h"
2223
#include "swift/Basic/Debug.h"
2324
#include "llvm/ADT/Hashing.h"
2425
#include "llvm/ADT/PointerUnion.h"
@@ -101,13 +102,15 @@ class ProtocolConformanceRef {
101102
return !isInvalid() && Union.is<ProtocolConformance*>();
102103
}
103104
ProtocolConformance *getConcrete() const {
105+
ASSERT(isConcrete());
104106
return Union.get<ProtocolConformance*>();
105107
}
106108

107109
bool isPack() const {
108110
return !isInvalid() && Union.is<PackConformance*>();
109111
}
110112
PackConformance *getPack() const {
113+
ASSERT(isPack());
111114
return Union.get<PackConformance*>();
112115
}
113116

@@ -116,6 +119,7 @@ class ProtocolConformanceRef {
116119
}
117120

118121
ProtocolDecl *getAbstract() const {
122+
ASSERT(isAbstract());
119123
return Union.get<ProtocolDecl*>();
120124
}
121125

include/swift/SIL/SILBridging.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1007,7 +1007,7 @@ struct BridgedWitnessTableEntry {
10071007
SWIFT_IMPORT_UNSAFE BRIDGED_INLINE BridgedDeclObj getAssociatedTypeRequirement() const;
10081008
SWIFT_IMPORT_UNSAFE BRIDGED_INLINE BridgedCanType getAssociatedTypeWitness() const;
10091009
SWIFT_IMPORT_UNSAFE BRIDGED_INLINE BridgedCanType getAssociatedConformanceRequirement() const;
1010-
SWIFT_IMPORT_UNSAFE BRIDGED_INLINE BridgedDeclObj getAssociatedConformanceDecl() const;
1010+
SWIFT_IMPORT_UNSAFE BRIDGED_INLINE BridgedCanType getAssociatedConformanceSubstType() const;
10111011
SWIFT_IMPORT_UNSAFE BRIDGED_INLINE BridgedConformance getAssociatedConformanceWitness() const;
10121012
SWIFT_IMPORT_UNSAFE BRIDGED_INLINE BridgedDeclObj getBaseProtocolRequirement() const;
10131013
SWIFT_IMPORT_UNSAFE BRIDGED_INLINE BridgedConformance getBaseProtocolWitness() const;
@@ -1022,7 +1022,7 @@ struct BridgedWitnessTableEntry {
10221022
BridgedCanType witness);
10231023
SWIFT_IMPORT_UNSAFE BRIDGED_INLINE
10241024
static BridgedWitnessTableEntry createAssociatedConformance(BridgedCanType requirement,
1025-
BridgedDeclObj protocolDecl,
1025+
BridgedCanType substType,
10261026
BridgedConformance witness);
10271027
SWIFT_IMPORT_UNSAFE BRIDGED_INLINE
10281028
static BridgedWitnessTableEntry createBaseProtocol(BridgedDeclObj requirement,

include/swift/SIL/SILBridgingImpl.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1832,8 +1832,8 @@ BridgedCanType BridgedWitnessTableEntry::getAssociatedConformanceRequirement() c
18321832
return unbridged().getAssociatedConformanceWitness().Requirement;
18331833
}
18341834

1835-
BridgedDeclObj BridgedWitnessTableEntry::getAssociatedConformanceDecl() const {
1836-
return {unbridged().getAssociatedConformanceWitness().Protocol};
1835+
BridgedCanType BridgedWitnessTableEntry::getAssociatedConformanceSubstType() const {
1836+
return {unbridged().getAssociatedConformanceWitness().SubstType};
18371837
}
18381838

18391839
BridgedConformance BridgedWitnessTableEntry::getAssociatedConformanceWitness() const {
@@ -1867,11 +1867,11 @@ BridgedWitnessTableEntry BridgedWitnessTableEntry::createAssociatedType(BridgedD
18671867
}
18681868

18691869
BridgedWitnessTableEntry BridgedWitnessTableEntry::createAssociatedConformance(BridgedCanType requirement,
1870-
BridgedDeclObj protocolDecl,
1870+
BridgedCanType substType,
18711871
BridgedConformance witness) {
18721872
return bridge(swift::SILWitnessTable::Entry(
18731873
swift::SILWitnessTable::AssociatedConformanceWitness{requirement.unbridged(),
1874-
protocolDecl.getAs<swift::ProtocolDecl>(),
1874+
substType.unbridged(),
18751875
witness.unbridged()}));
18761876
}
18771877

include/swift/SIL/SILWitnessTable.h

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -64,13 +64,11 @@ class SILWitnessTable : public llvm::ilist_node<SILWitnessTable>,
6464
/// A witness table entry describing the witness for an associated type's
6565
/// protocol requirement.
6666
struct AssociatedConformanceWitness {
67-
/// The associated type required. A dependent type in the protocol's
68-
/// context.
67+
/// The subject type of the associated requirement.
6968
CanType Requirement;
70-
/// The protocol requirement on the type.
71-
ProtocolDecl *Protocol;
72-
/// The ProtocolConformance satisfying the requirement. Null if the
73-
/// conformance is dependent.
69+
/// FIXME: Temporary.
70+
CanType SubstType;
71+
/// The ProtocolConformanceRef satisfying the requirement.
7472
ProtocolConformanceRef Witness;
7573
};
7674

@@ -160,6 +158,7 @@ class SILWitnessTable : public llvm::ilist_node<SILWitnessTable>,
160158
/// conditional. These aren't public, but any witness thunks need to feed them
161159
/// into the true witness functions.
162160
struct ConditionalConformance {
161+
/// FIXME: Temporary.
163162
CanType Requirement;
164163
ProtocolConformanceRef Conformance;
165164
};

lib/AST/ProtocolConformanceRef.cpp

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,8 +49,6 @@ bool ProtocolConformanceRef::isInvalid() const {
4949
}
5050

5151
ProtocolDecl *ProtocolConformanceRef::getRequirement() const {
52-
assert(!isInvalid());
53-
5452
if (isConcrete()) {
5553
return getConcrete()->getProtocol();
5654
} else if (isPack()) {

0 commit comments

Comments
 (0)