@@ -367,30 +367,13 @@ case TypeKind::Id:
367367
368368 case TypeKind::OpaqueTypeArchetype: {
369369 auto opaque = cast<OpaqueTypeArchetypeType>(base);
370- if (opaque->getSubstitutions ().empty ())
370+ auto subMap = opaque->getSubstitutions ();
371+ auto newSubMap = asDerived ().transformSubMap (subMap);
372+ if (newSubMap == subMap)
371373 return t;
372-
373- SmallVector<Type, 4 > newSubs;
374- bool anyChanged = false ;
375- for (auto replacement : opaque->getSubstitutions ().getReplacementTypes ()) {
376- Type newReplacement = doIt (replacement, TypePosition::Invariant);
377- if (!newReplacement)
378- return Type ();
379- newSubs.push_back (newReplacement);
380- if (replacement.getPointer () != newReplacement.getPointer ())
381- anyChanged = true ;
382- }
383-
384- if (!anyChanged)
385- return t;
386-
387- // FIXME: This re-looks-up conformances instead of transforming them in
388- // a systematic way.
389- auto sig = opaque->getDecl ()->getGenericSignature ();
390- auto newSubMap =
391- SubstitutionMap::get (sig,
392- QueryReplacementTypeArray{sig, newSubs},
393- LookUpConformanceInModule ());
374+ if (!newSubMap)
375+ return Type ();
376+
394377 return OpaqueTypeArchetypeType::get (opaque->getDecl (),
395378 opaque->getInterfaceType (),
396379 newSubMap);
@@ -999,6 +982,32 @@ case TypeKind::Id:
999982
1000983 llvm_unreachable (" Unhandled type in transformation" );
1001984 }
985+
986+ // If original was non-empty and transformed is empty, we're
987+ // signaling failure, that is, a Type() return from doIt().
988+ SubstitutionMap transformSubMap (SubstitutionMap subs) {
989+ if (subs.empty ())
990+ return subs;
991+
992+ SmallVector<Type, 4 > newSubs;
993+ bool anyChanged = false ;
994+ for (auto replacement : subs.getReplacementTypes ()) {
995+ Type newReplacement = doIt (replacement, TypePosition::Invariant);
996+ if (!newReplacement)
997+ return SubstitutionMap ();
998+ newSubs.push_back (newReplacement);
999+ if (replacement.getPointer () != newReplacement.getPointer ())
1000+ anyChanged = true ;
1001+ }
1002+
1003+ if (!anyChanged)
1004+ return subs;
1005+
1006+ auto sig = subs.getGenericSignature ();
1007+ return SubstitutionMap::get (sig,
1008+ QueryReplacementTypeArray{sig, newSubs},
1009+ LookUpConformanceInModule ());
1010+ }
10021011};
10031012
10041013}
0 commit comments