@@ -3517,7 +3517,50 @@ class DeclDeserializer {
35173517 StringRef blobData) {
35183518 return deserializeAnyFunc (scratch, blobData, /* isAccessor*/ true );
35193519 }
3520-
3520+
3521+ void deserializeConditionalSubstitutions (
3522+ SmallVectorImpl<OpaqueTypeDecl::ConditionallyAvailableSubstitutions *>
3523+ &limitedAvailability) {
3524+ SmallVector<uint64_t , 4 > scratch;
3525+ StringRef blobData;
3526+
3527+ while (true ) {
3528+ llvm::BitstreamEntry entry =
3529+ MF.fatalIfUnexpected (MF.DeclTypeCursor .advance (AF_DontPopBlockAtEnd));
3530+ if (entry.Kind != llvm::BitstreamEntry::Record)
3531+ break ;
3532+
3533+ scratch.clear ();
3534+ unsigned recordID = MF.fatalIfUnexpected (
3535+ MF.DeclTypeCursor .readRecord (entry.ID , scratch, &blobData));
3536+ if (recordID != decls_block::CONDITIONAL_SUBSTITUTION)
3537+ break ;
3538+
3539+ ArrayRef<uint64_t > rawConditions;
3540+ SubstitutionMapID substitutionMapRef;
3541+
3542+ decls_block::ConditionalSubstitutionLayout::readRecord (
3543+ scratch, substitutionMapRef, rawConditions);
3544+
3545+ SmallVector<VersionRange, 4 > conditions;
3546+ llvm::transform (rawConditions, std::back_inserter (conditions),
3547+ [&](uint64_t id) {
3548+ llvm::VersionTuple lowerEndpoint;
3549+ if (lowerEndpoint.tryParse (MF.getIdentifier (id).str ()))
3550+ MF.fatal ();
3551+ return VersionRange::allGTE (lowerEndpoint);
3552+ });
3553+
3554+ auto subMapOrError = MF.getSubstitutionMapChecked (substitutionMapRef);
3555+ if (!subMapOrError)
3556+ MF.fatal ();
3557+
3558+ limitedAvailability.push_back (
3559+ OpaqueTypeDecl::ConditionallyAvailableSubstitutions::get (
3560+ ctx, conditions, subMapOrError.get ()));
3561+ }
3562+ }
3563+
35213564 Expected<Decl *> deserializeOpaqueType (ArrayRef<uint64_t > scratch,
35223565 StringRef blobData) {
35233566 DeclID namingDeclID;
@@ -3568,7 +3611,24 @@ class DeclDeserializer {
35683611 auto subMapOrError = MF.getSubstitutionMapChecked (underlyingTypeSubsID);
35693612 if (!subMapOrError)
35703613 return subMapOrError.takeError ();
3571- opaqueDecl->setUniqueUnderlyingTypeSubstitutions (subMapOrError.get ());
3614+
3615+ // Check whether there are any conditionally available substitutions.
3616+ // If there are, it means that "unique" we just read is a universally
3617+ // available substitution.
3618+ SmallVector<OpaqueTypeDecl::ConditionallyAvailableSubstitutions *>
3619+ limitedAvailability;
3620+
3621+ deserializeConditionalSubstitutions (limitedAvailability);
3622+
3623+ if (limitedAvailability.empty ()) {
3624+ opaqueDecl->setUniqueUnderlyingTypeSubstitutions (subMapOrError.get ());
3625+ } else {
3626+ limitedAvailability.push_back (
3627+ OpaqueTypeDecl::ConditionallyAvailableSubstitutions::get (
3628+ ctx, VersionRange::empty (), subMapOrError.get ()));
3629+
3630+ opaqueDecl->setConditionallyAvailableSubstitutions (limitedAvailability);
3631+ }
35723632 }
35733633 return opaqueDecl;
35743634 }
0 commit comments