Skip to content

Commit 628af19

Browse files
committed
AST: Fix -verify-generic-signatures mode to not violate requirement machine invariants
We can't feed resolved DependentMemberTypes into the Requirement Machine since that will trigger an assertion if there is a missing conformance. Instead, copy and paste some logic from GenericSignatureBuilder.cpp to 'erase' resolved DependentMemberTypes into unresolved DependentMemberTypes.
1 parent d3c224b commit 628af19

File tree

2 files changed

+36
-3
lines changed

2 files changed

+36
-3
lines changed

lib/AST/GenericSignature.cpp

Lines changed: 35 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -994,6 +994,39 @@ void GenericSignature::verify(ArrayRef<Requirement> reqts) const {
994994
}
995995
}
996996

997+
static Type stripBoundDependentMemberTypes(Type t) {
998+
if (auto *depMemTy = t->getAs<DependentMemberType>()) {
999+
return DependentMemberType::get(
1000+
stripBoundDependentMemberTypes(depMemTy->getBase()),
1001+
depMemTy->getName());
1002+
}
1003+
1004+
return t;
1005+
}
1006+
1007+
static Requirement stripBoundDependentMemberTypes(Requirement req) {
1008+
auto subjectType = stripBoundDependentMemberTypes(req.getFirstType());
1009+
1010+
switch (req.getKind()) {
1011+
case RequirementKind::Conformance:
1012+
return Requirement(RequirementKind::Conformance, subjectType,
1013+
req.getSecondType());
1014+
1015+
case RequirementKind::Superclass:
1016+
case RequirementKind::SameType:
1017+
return Requirement(req.getKind(), subjectType,
1018+
req.getSecondType().transform([](Type t) {
1019+
return stripBoundDependentMemberTypes(t);
1020+
}));
1021+
1022+
case RequirementKind::Layout:
1023+
return Requirement(RequirementKind::Layout, subjectType,
1024+
req.getLayoutConstraint());
1025+
}
1026+
1027+
llvm_unreachable("Bad requirement kind");
1028+
}
1029+
9971030
void swift::validateGenericSignature(ASTContext &context,
9981031
GenericSignature sig) {
9991032
llvm::errs() << "Validating generic signature: ";
@@ -1007,7 +1040,7 @@ void swift::validateGenericSignature(ASTContext &context,
10071040

10081041
SmallVector<Requirement, 2> requirements;
10091042
for (auto requirement : sig.getRequirements())
1010-
requirements.push_back(requirement);
1043+
requirements.push_back(stripBoundDependentMemberTypes(requirement));
10111044

10121045
{
10131046
PrettyStackTraceGenericSignature debugStack("verifying", sig);
@@ -1043,7 +1076,7 @@ void swift::validateGenericSignature(ASTContext &context,
10431076
SmallVector<Requirement, 2> newRequirements;
10441077
for (unsigned i : indices(requirements)) {
10451078
if (i != victimIndex)
1046-
newRequirements.push_back(requirements[i]);
1079+
newRequirements.push_back(stripBoundDependentMemberTypes(requirements[i]));
10471080
}
10481081

10491082
auto newSigWithError = evaluateOrDefault(
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
// Verifies that all of the generic signatures in the standard library are
22
// minimal and canonical.
33

4-
// RUN: %target-typecheck-verify-swift -verify-generic-signatures Swift
4+
// RUN: %target-typecheck-verify-swift -verify-generic-signatures Swift -requirement-machine-abstract-signatures=on

0 commit comments

Comments
 (0)