@@ -730,6 +730,8 @@ struct GenericSignatureBuilder::Implementation {
730
730
std::vector<ConflictingConcreteTypeRequirement>
731
731
ConflictingConcreteTypeRequirements;
732
732
733
+ llvm::DenseSet<ExplicitRequirement> ExplicitConformancesImpliedByConcrete;
734
+
733
735
#ifndef NDEBUG
734
736
// / Whether we've already computed redundant requiremnts.
735
737
bool computedRedundantRequirements = false ;
@@ -6256,6 +6258,20 @@ static bool typeConflictsWithLayoutConstraint(Type t, LayoutConstraint layout) {
6256
6258
return false ;
6257
6259
}
6258
6260
6261
+ static bool isConcreteConformance (const EquivalenceClass &equivClass,
6262
+ ProtocolDecl *proto,
6263
+ GenericSignatureBuilder &builder) {
6264
+ if (equivClass.concreteType &&
6265
+ builder.lookupConformance (equivClass.concreteType , proto)) {
6266
+ return true ;
6267
+ } else if (equivClass.superclass &&
6268
+ builder.lookupConformance (equivClass.superclass , proto)) {
6269
+ return true ;
6270
+ }
6271
+
6272
+ return false ;
6273
+ }
6274
+
6259
6275
void GenericSignatureBuilder::computeRedundantRequirements () {
6260
6276
assert (!Impl->computedRedundantRequirements &&
6261
6277
" Already computed redundant requirements" );
@@ -6289,6 +6305,14 @@ void GenericSignatureBuilder::computeRedundantRequirements() {
6289
6305
6290
6306
// FIXME: Check for a conflict via the concrete type.
6291
6307
exact.push_back (constraint);
6308
+
6309
+ if (!source->isDerivedRequirement ()) {
6310
+ if (isConcreteConformance (equivClass, entry.first , *this )) {
6311
+ Impl->ExplicitConformancesImpliedByConcrete .insert (
6312
+ ExplicitRequirement::fromExplicitConstraint (
6313
+ RequirementKind::Conformance, constraint));
6314
+ }
6315
+ }
6292
6316
}
6293
6317
6294
6318
graph.addConstraintsFromEquivClass (RequirementKind::Conformance,
@@ -8159,7 +8183,7 @@ void GenericSignatureBuilder::checkLayoutConstraints(
8159
8183
}
8160
8184
8161
8185
bool GenericSignatureBuilder::isRedundantExplicitRequirement (
8162
- ExplicitRequirement req) const {
8186
+ const ExplicitRequirement & req) const {
8163
8187
assert (Impl->computedRedundantRequirements &&
8164
8188
" Must ensure computeRedundantRequirements() is called first" );
8165
8189
auto &redundantReqs = Impl->RedundantRequirements ;
@@ -8466,23 +8490,6 @@ static void checkGenericSignature(CanGenericSignature canSig,
8466
8490
}
8467
8491
#endif
8468
8492
8469
- bool GenericSignatureBuilder::hasExplicitConformancesImpliedByConcrete () const {
8470
- for (auto pair : Impl->RedundantRequirements ) {
8471
- if (pair.first .getKind () != RequirementKind::Conformance)
8472
- continue ;
8473
-
8474
- for (auto impliedByReq : pair.second ) {
8475
- if (impliedByReq.getKind () == RequirementKind::Superclass)
8476
- return true ;
8477
-
8478
- if (impliedByReq.getKind () == RequirementKind::SameType)
8479
- return true ;
8480
- }
8481
- }
8482
-
8483
- return false ;
8484
- }
8485
-
8486
8493
static Type stripBoundDependentMemberTypes (Type t) {
8487
8494
if (auto *depMemTy = t->getAs <DependentMemberType>()) {
8488
8495
return DependentMemberType::get (
@@ -8532,7 +8539,8 @@ GenericSignature GenericSignatureBuilder::rebuildSignatureWithoutRedundantRequir
8532
8539
assert (req.getKind () != RequirementKind::SameType &&
8533
8540
" Should not see same-type requirement here" );
8534
8541
8535
- if (isRedundantExplicitRequirement (req))
8542
+ if (isRedundantExplicitRequirement (req) &&
8543
+ Impl->ExplicitConformancesImpliedByConcrete .count (req))
8536
8544
continue ;
8537
8545
8538
8546
auto subjectType = req.getSource ()->getStoredType ();
@@ -8618,8 +8626,12 @@ GenericSignature GenericSignatureBuilder::computeGenericSignature(
8618
8626
assert (!Impl->HadAnyError &&
8619
8627
" Rebuilt signature had errors" );
8620
8628
8621
- assert (!hasExplicitConformancesImpliedByConcrete () &&
8622
- " Rebuilt signature still had redundant conformance requirements" );
8629
+ #ifndef NDEBUG
8630
+ for (const auto &req : Impl->ExplicitConformancesImpliedByConcrete ) {
8631
+ assert (!isRedundantExplicitRequirement (req) &&
8632
+ " Rebuilt signature still had redundant conformance requirements" );
8633
+ }
8634
+ #endif
8623
8635
}
8624
8636
8625
8637
// If any of our explicit conformance requirements were implied by
@@ -8634,7 +8646,7 @@ GenericSignature GenericSignatureBuilder::computeGenericSignature(
8634
8646
if (!rebuildingWithoutRedundantConformances &&
8635
8647
!buildingRequirementSignature &&
8636
8648
!Impl->HadAnyError &&
8637
- hasExplicitConformancesImpliedByConcrete ()) {
8649
+ !Impl-> ExplicitConformancesImpliedByConcrete . empty ()) {
8638
8650
return std::move (*this ).rebuildSignatureWithoutRedundantRequirements (
8639
8651
allowConcreteGenericParams,
8640
8652
buildingRequirementSignature);
0 commit comments