Skip to content

Commit 8f4ad8b

Browse files
committed
[AST] Add a possibility to check whether PackConformance is invalid
1 parent 878066b commit 8f4ad8b

File tree

4 files changed

+23
-5
lines changed

4 files changed

+23
-5
lines changed

include/swift/AST/PackConformance.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,8 @@ class alignas(1 << DeclAlignInBits) PackConformance final
6868

6969
ArrayRef<ProtocolConformanceRef> getPatternConformances() const;
7070

71+
bool isInvalid() const;
72+
7173
bool isCanonical() const;
7274

7375
PackConformance *getCanonicalConformance() const;
@@ -103,4 +105,4 @@ void simple_display(llvm::raw_ostream &out, PackConformance *conformance);
103105

104106
} // end namespace swift
105107

106-
#endif // SWIFT_AST_PACKCONFORMANCE_H
108+
#endif // SWIFT_AST_PACKCONFORMANCE_H

lib/AST/Module.cpp

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1827,8 +1827,11 @@ static ProtocolConformanceRef getPackTypeConformance(
18271827
patternConformances.push_back(patternConformance);
18281828
}
18291829

1830-
return ProtocolConformanceRef(
1831-
PackConformance::get(type, protocol, patternConformances));
1830+
auto *conformance = PackConformance::get(type, protocol, patternConformances);
1831+
if (conformance->isInvalid())
1832+
return ProtocolConformanceRef::forInvalid();
1833+
1834+
return ProtocolConformanceRef(conformance);
18321835
}
18331836

18341837
ProtocolConformanceRef

lib/AST/PackConformance.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,11 @@ size_t PackConformance::numTrailingObjects(
5555
return ConformingType->getNumElements();
5656
}
5757

58+
bool PackConformance::isInvalid() const {
59+
return llvm::any_of(getPatternConformances(),
60+
[&](const auto ref) { return ref.isInvalid(); });
61+
}
62+
5863
ArrayRef<ProtocolConformanceRef>
5964
PackConformance::getPatternConformances() const {
6065
return {getTrailingObjects<ProtocolConformanceRef>(),
@@ -244,6 +249,9 @@ PackConformance::subst(InFlightSubstitution &IFS) const {
244249

245250
auto substConformance = PackConformance::get(substConformingType, Protocol,
246251
expander.substConformances);
252+
if (substConformance->isInvalid())
253+
return ProtocolConformanceRef::forInvalid();
254+
247255
return ProtocolConformanceRef(substConformance);
248256
}
249257

lib/AST/Type.cpp

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4547,8 +4547,13 @@ operator()(CanType dependentType, Type conformingReplacementType,
45474547
(*this)(dependentType, conformingPackElt, conformedProtocol);
45484548
conformances.push_back(conformance);
45494549
}
4550-
return ProtocolConformanceRef(
4551-
PackConformance::get(conformingPack, conformedProtocol, conformances));
4550+
4551+
auto *conformance =
4552+
PackConformance::get(conformingPack, conformedProtocol, conformances);
4553+
if (conformance->isInvalid())
4554+
return ProtocolConformanceRef::forInvalid();
4555+
4556+
return ProtocolConformanceRef(conformance);
45524557
}
45534558

45544559
assert((conformingReplacementType->is<ErrorType>() ||

0 commit comments

Comments
 (0)