Skip to content

Commit e0c7627

Browse files
committed
GSB: getBestConstraintSource() never returns nullptr
1 parent b9f5267 commit e0c7627

File tree

1 file changed

+10
-12
lines changed

1 file changed

+10
-12
lines changed

lib/AST/GenericSignatureBuilder.cpp

Lines changed: 10 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -6903,14 +6903,14 @@ void GenericSignatureBuilder::checkLayoutConstraints(
69036903
namespace {
69046904
/// Retrieve the best requirement source from a set of constraints.
69056905
template<typename T>
6906-
Optional<const RequirementSource *>
6906+
const RequirementSource *
69076907
getBestConstraintSource(ArrayRef<Constraint<T>> constraints,
69086908
llvm::function_ref<bool(const T&)> matches) {
6909-
Optional<const RequirementSource *> bestSource;
6909+
const RequirementSource *bestSource = nullptr;
69106910
for (const auto &constraint : constraints) {
69116911
if (!matches(constraint.value)) continue;
69126912

6913-
if (!bestSource || constraint.source->compare(*bestSource) < 0)
6913+
if (!bestSource || constraint.source->compare(bestSource) < 0)
69146914
bestSource = constraint.source;
69156915
}
69166916

@@ -6999,18 +6999,17 @@ void GenericSignatureBuilder::enumerateRequirements(
69996999
continue;
70007000

70017001
// If we have a superclass, produce a superclass requirement
7002-
if (equivClass->superclass && !equivClass->recursiveSuperclassType) {
7002+
if (equivClass->superclass &&
7003+
!equivClass->recursiveSuperclassType &&
7004+
!equivClass->superclass->hasError()) {
70037005
auto bestSource =
70047006
getBestConstraintSource<Type>(equivClass->superclassConstraints,
70057007
[&](const Type &type) {
70067008
return type->isEqual(equivClass->superclass);
70077009
});
70087010

7009-
if (!bestSource)
7010-
bestSource = RequirementSource::forAbstract(*this, subjectType);
7011-
70127011
f(RequirementKind::Superclass, subjectType, equivClass->superclass,
7013-
*bestSource);
7012+
bestSource);
70147013
}
70157014

70167015
// If we have a layout constraint, produce a layout requirement.
@@ -7020,10 +7019,9 @@ void GenericSignatureBuilder::enumerateRequirements(
70207019
[&](const LayoutConstraint &layout) {
70217020
return layout == equivClass->layout;
70227021
});
7023-
if (!bestSource)
7024-
bestSource = RequirementSource::forAbstract(*this, subjectType);
70257022

7026-
f(RequirementKind::Layout, subjectType, equivClass->layout, *bestSource);
7023+
f(RequirementKind::Layout, subjectType, equivClass->layout,
7024+
bestSource);
70277025
}
70287026

70297027
// Enumerate conformance requirements.
@@ -7037,7 +7035,7 @@ void GenericSignatureBuilder::enumerateRequirements(
70377035

70387036
protocolSources.insert(
70397037
{conforms.first,
7040-
*getBestConstraintSource<ProtocolDecl *>(conforms.second,
7038+
getBestConstraintSource<ProtocolDecl *>(conforms.second,
70417039
[&](ProtocolDecl *proto) {
70427040
return proto == conforms.first;
70437041
})});

0 commit comments

Comments
 (0)