Skip to content

Commit 395e998

Browse files
authored
Merge pull request #14102 from DougGregor/sr-6797-4.1
[4.1] [GSB] Ensure that we don't build an invalid potential archetype.
2 parents 77a4527 + 387f285 commit 395e998

File tree

4 files changed

+22
-3
lines changed

4 files changed

+22
-3
lines changed

include/swift/AST/GenericSignature.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -147,7 +147,8 @@ class alignas(1 << TypeAlignInBits) GenericSignature final
147147
/// requirements, first canonicalizing the types.
148148
static CanGenericSignature getCanonical(
149149
ArrayRef<GenericTypeParamType *> params,
150-
ArrayRef<Requirement> requirements);
150+
ArrayRef<Requirement> requirements,
151+
bool skipValidation = false);
151152

152153
/// Retrieve the generic parameters.
153154
ArrayRef<GenericTypeParamType *> getGenericParams() const {

lib/AST/GenericSignature.cpp

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -150,7 +150,8 @@ static unsigned getRequirementKindOrder(RequirementKind kind) {
150150

151151
CanGenericSignature GenericSignature::getCanonical(
152152
ArrayRef<GenericTypeParamType *> params,
153-
ArrayRef<Requirement> requirements) {
153+
ArrayRef<Requirement> requirements,
154+
bool skipValidation) {
154155
// Canonicalize the parameters and requirements.
155156
SmallVector<GenericTypeParamType*, 8> canonicalParams;
156157
canonicalParams.reserve(params.size());
@@ -172,10 +173,14 @@ CanGenericSignature GenericSignature::getCanonical(
172173
reqt.getLayoutConstraint()));
173174
}
174175

176+
(void)skipValidation;
175177
auto canSig = get(canonicalParams, canonicalRequirements,
176178
/*isKnownCanonical=*/true);
177179

178180
#ifndef NDEBUG
181+
if (skipValidation)
182+
return CanGenericSignature(canSig);
183+
179184
PrettyStackTraceGenericSignature debugStack("canonicalizing", canSig);
180185

181186
// Check that the signature is canonical.

lib/AST/GenericSignatureBuilder.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3026,6 +3026,12 @@ ResolvedType GenericSignatureBuilder::maybeResolveEquivalenceClass(
30263026
TypeDecl *nestedTypeDecl;
30273027
SmallVector<TypeDecl *, 4> concreteDecls;
30283028
if (auto assocType = depMemTy->getAssocType()) {
3029+
// Check whether this associated type references a protocol to which
3030+
// the base conforms. If not, it's unresolved.
3031+
if (baseEquivClass->conformsTo.find(assocType->getProtocol())
3032+
== baseEquivClass->conformsTo.end())
3033+
return ResolvedType::forUnresolved(baseEquivClass);
3034+
30293035
nestedTypeDecl = assocType;
30303036
} else {
30313037
nestedTypeDecl =

lib/Sema/TypeCheckDecl.cpp

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4876,8 +4876,15 @@ class DeclChecker : public DeclVisitor<DeclChecker> {
48764876
llvm::errs() << "Requirement signature: ";
48774877
requirementsSig->print(llvm::errs());
48784878
llvm::errs() << "\n";
4879+
4880+
// Note: One cannot canonicalize a requirement signature, because
4881+
// requirement signatures are necessarily missing requirements.
48794882
llvm::errs() << "Canonical requirement signature: ";
4880-
requirementsSig->getCanonicalSignature()->print(llvm::errs());
4883+
auto canRequirementSig =
4884+
GenericSignature::getCanonical(requirementsSig->getGenericParams(),
4885+
requirementsSig->getRequirements(),
4886+
/*skipValidation=*/true);
4887+
canRequirementSig->print(llvm::errs());
48814888
llvm::errs() << "\n";
48824889
}
48834890
}

0 commit comments

Comments
 (0)