@@ -3548,6 +3548,40 @@ class DeclDeserializer {
35483548 return deserializeAnyFunc (scratch, blobData, /* isAccessor*/ true );
35493549 }
35503550
3551+ void deserializeConditionalSubstitutionConditions (
3552+ SmallVectorImpl<OpaqueTypeDecl::AvailabilityCondition> &conditions) {
3553+ using namespace decls_block ;
3554+
3555+ SmallVector<uint64_t , 4 > scratch;
3556+ StringRef blobData;
3557+
3558+ while (true ) {
3559+ llvm::BitstreamEntry entry =
3560+ MF.fatalIfUnexpected (MF.DeclTypeCursor .advance (AF_DontPopBlockAtEnd));
3561+ if (entry.Kind != llvm::BitstreamEntry::Record)
3562+ break ;
3563+
3564+ scratch.clear ();
3565+
3566+ unsigned recordID = MF.fatalIfUnexpected (
3567+ MF.DeclTypeCursor .readRecord (entry.ID , scratch, &blobData));
3568+ if (recordID != decls_block::CONDITIONAL_SUBSTITUTION_COND)
3569+ break ;
3570+
3571+ bool isUnavailability;
3572+ DEF_VER_TUPLE_PIECES (condition);
3573+
3574+ ConditionalSubstitutionConditionLayout::readRecord (
3575+ scratch, isUnavailability, LIST_VER_TUPLE_PIECES (condition));
3576+
3577+ llvm::VersionTuple condition;
3578+ DECODE_VER_TUPLE (condition);
3579+
3580+ conditions.push_back (std::make_pair (VersionRange::allGTE (condition),
3581+ isUnavailability));
3582+ }
3583+ }
3584+
35513585 void deserializeConditionalSubstitutions (
35523586 SmallVectorImpl<OpaqueTypeDecl::ConditionallyAvailableSubstitutions *>
35533587 &limitedAvailability) {
@@ -3566,20 +3600,16 @@ class DeclDeserializer {
35663600 if (recordID != decls_block::CONDITIONAL_SUBSTITUTION)
35673601 break ;
35683602
3569- ArrayRef<uint64_t > rawConditions;
35703603 SubstitutionMapID substitutionMapRef;
35713604
35723605 decls_block::ConditionalSubstitutionLayout::readRecord (
3573- scratch, substitutionMapRef, rawConditions);
3606+ scratch, substitutionMapRef);
3607+
3608+ SmallVector<OpaqueTypeDecl::AvailabilityCondition, 2 > conditions;
3609+ deserializeConditionalSubstitutionConditions (conditions);
35743610
3575- SmallVector<VersionRange, 4 > conditions;
3576- llvm::transform (rawConditions, std::back_inserter (conditions),
3577- [&](uint64_t id) {
3578- llvm::VersionTuple lowerEndpoint;
3579- if (lowerEndpoint.tryParse (MF.getIdentifier (id).str ()))
3580- MF.fatal ();
3581- return VersionRange::allGTE (lowerEndpoint);
3582- });
3611+ if (conditions.empty ())
3612+ MF.fatal ();
35833613
35843614 auto subMapOrError = MF.getSubstitutionMapChecked (substitutionMapRef);
35853615 if (!subMapOrError)
@@ -3655,7 +3685,8 @@ class DeclDeserializer {
36553685 } else {
36563686 limitedAvailability.push_back (
36573687 OpaqueTypeDecl::ConditionallyAvailableSubstitutions::get (
3658- ctx, VersionRange::empty (), subMapOrError.get ()));
3688+ ctx, {{VersionRange::empty (), /* unavailability=*/ false }},
3689+ subMapOrError.get ()));
36593690
36603691 opaqueDecl->setConditionallyAvailableSubstitutions (limitedAvailability);
36613692 }
0 commit comments