Skip to content

Commit 225341e

Browse files
committed
[Decl] Start storing and serializing "unavailability" bit per condition
1 parent 8185db4 commit 225341e

File tree

6 files changed

+33
-21
lines changed

6 files changed

+33
-21
lines changed

include/swift/AST/Decl.h

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2952,9 +2952,12 @@ class OpaqueTypeDecl final :
29522952
return false;
29532953
}
29542954

2955+
using AvailabilityCondition = std::pair<VersionRange, bool>;
2956+
29552957
class ConditionallyAvailableSubstitutions final
2956-
: private llvm::TrailingObjects<ConditionallyAvailableSubstitutions,
2957-
VersionRange> {
2958+
: private llvm::TrailingObjects<
2959+
ConditionallyAvailableSubstitutions,
2960+
AvailabilityCondition> {
29582961
friend TrailingObjects;
29592962

29602963
unsigned NumAvailabilityConditions;
@@ -2964,25 +2967,25 @@ class OpaqueTypeDecl final :
29642967
/// A type with limited availability described by the provided set
29652968
/// of availability conditions (with `and` relationship).
29662969
ConditionallyAvailableSubstitutions(
2967-
ArrayRef<VersionRange> availabilityContext,
2970+
ArrayRef<AvailabilityCondition> availabilityContext,
29682971
SubstitutionMap substitutions)
29692972
: NumAvailabilityConditions(availabilityContext.size()),
29702973
Substitutions(substitutions) {
29712974
assert(!availabilityContext.empty());
29722975
std::uninitialized_copy(availabilityContext.begin(),
29732976
availabilityContext.end(),
2974-
getTrailingObjects<VersionRange>());
2977+
getTrailingObjects<AvailabilityCondition>());
29752978
}
29762979

29772980
public:
2978-
ArrayRef<VersionRange> getAvailability() const {
2979-
return {getTrailingObjects<VersionRange>(), NumAvailabilityConditions};
2981+
ArrayRef<AvailabilityCondition> getAvailability() const {
2982+
return {getTrailingObjects<AvailabilityCondition>(), NumAvailabilityConditions};
29802983
}
29812984

29822985
SubstitutionMap getSubstitutions() const { return Substitutions; }
29832986

29842987
static ConditionallyAvailableSubstitutions *
2985-
get(ASTContext &ctx, ArrayRef<VersionRange> availabilityContext,
2988+
get(ASTContext &ctx, ArrayRef<AvailabilityCondition> availabilityContext,
29862989
SubstitutionMap substitutions);
29872990
};
29882991
};

lib/AST/Decl.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8263,9 +8263,11 @@ void OpaqueTypeDecl::setConditionallyAvailableSubstitutions(
82638263

82648264
OpaqueTypeDecl::ConditionallyAvailableSubstitutions *
82658265
OpaqueTypeDecl::ConditionallyAvailableSubstitutions::get(
8266-
ASTContext &ctx, ArrayRef<VersionRange> availabilityContext,
8266+
ASTContext &ctx,
8267+
ArrayRef<AvailabilityCondition> availabilityContext,
82678268
SubstitutionMap substitutions) {
8268-
auto size = totalSizeToAlloc<VersionRange>(availabilityContext.size());
8269+
auto size =
8270+
totalSizeToAlloc<AvailabilityCondition>(availabilityContext.size());
82698271
auto mem = ctx.Allocate(size, alignof(ConditionallyAvailableSubstitutions));
82708272
return new (mem)
82718273
ConditionallyAvailableSubstitutions(availabilityContext, substitutions);

lib/IRGen/GenMeta.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2333,9 +2333,9 @@ namespace {
23332333
for (unsigned condIndex : indices(conditions)) {
23342334
const auto &condition = conditions[condIndex];
23352335

2336-
assert(condition.hasLowerEndpoint());
2336+
assert(condition.first.hasLowerEndpoint());
23372337

2338-
auto version = condition.getLowerEndpoint();
2338+
auto version = condition.first.getLowerEndpoint();
23392339
auto *major = getInt32Constant(version.getMajor());
23402340
auto *minor = getInt32Constant(version.getMinor());
23412341
auto *patch = getInt32Constant(version.getSubminor());
@@ -2367,7 +2367,7 @@ namespace {
23672367
auto universal = substitutionSet.back();
23682368

23692369
assert(universal->getAvailability().size() == 1 &&
2370-
universal->getAvailability()[0].isEmpty());
2370+
universal->getAvailability()[0].first.isEmpty());
23712371

23722372
IGF.Builder.CreateRet(
23732373
getResultValue(IGF, genericEnv, universal->getSubstitutions()));

lib/Sema/MiscDiagnostics.cpp

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2809,6 +2809,8 @@ class OpaqueUnderlyingTypeChecker : public ASTWalker {
28092809
// There is no clear winner here since there are candidates within
28102810
// limited availability contexts.
28112811
void finalizeOpaque(const Candidate &universallyAvailable) {
2812+
using AvailabilityCondition = OpaqueTypeDecl::AvailabilityCondition;
2813+
28122814
SmallVector<OpaqueTypeDecl::ConditionallyAvailableSubstitutions *, 4>
28132815
conditionalSubstitutions;
28142816

@@ -2819,12 +2821,14 @@ class OpaqueUnderlyingTypeChecker : public ASTWalker {
28192821
if (!availabilityContext)
28202822
continue;
28212823

2822-
SmallVector<VersionRange, 4> conditions;
2824+
SmallVector<AvailabilityCondition, 4> conditions;
28232825

28242826
llvm::transform(availabilityContext->getCond(),
28252827
std::back_inserter(conditions),
28262828
[&](const StmtConditionElement &elt) {
2827-
return elt.getAvailability()->getAvailableRange();
2829+
auto condition = elt.getAvailability();
2830+
return std::make_pair(condition->getAvailableRange(),
2831+
condition->isUnavailability());
28282832
});
28292833

28302834
conditionalSubstitutions.push_back(
@@ -2836,7 +2840,7 @@ class OpaqueUnderlyingTypeChecker : public ASTWalker {
28362840
// Add universally available choice as the last one.
28372841
conditionalSubstitutions.push_back(
28382842
OpaqueTypeDecl::ConditionallyAvailableSubstitutions::get(
2839-
Ctx, {VersionRange::empty()},
2843+
Ctx, {{VersionRange::empty(), /*unavailable=*/false}},
28402844
std::get<1>(universallyAvailable)
28412845
.mapReplacementTypesOutOfContext()));
28422846

lib/Serialization/Deserialization.cpp

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3549,7 +3549,7 @@ class DeclDeserializer {
35493549
}
35503550

35513551
void deserializeConditionalSubstitutionConditions(
3552-
SmallVectorImpl<VersionRange> &conditions) {
3552+
SmallVectorImpl<OpaqueTypeDecl::AvailabilityCondition> &conditions) {
35533553
using namespace decls_block;
35543554

35553555
SmallVector<uint64_t, 4> scratch;
@@ -3577,7 +3577,8 @@ class DeclDeserializer {
35773577
llvm::VersionTuple condition;
35783578
DECODE_VER_TUPLE(condition);
35793579

3580-
conditions.push_back(VersionRange::allGTE(condition));
3580+
conditions.push_back(std::make_pair(VersionRange::allGTE(condition),
3581+
isUnavailability));
35813582
}
35823583
}
35833584

@@ -3604,7 +3605,7 @@ class DeclDeserializer {
36043605
decls_block::ConditionalSubstitutionLayout::readRecord(
36053606
scratch, substitutionMapRef);
36063607

3607-
SmallVector<VersionRange, 2> conditions;
3608+
SmallVector<OpaqueTypeDecl::AvailabilityCondition, 2> conditions;
36083609
deserializeConditionalSubstitutionConditions(conditions);
36093610

36103611
if (conditions.empty())
@@ -3684,7 +3685,8 @@ class DeclDeserializer {
36843685
} else {
36853686
limitedAvailability.push_back(
36863687
OpaqueTypeDecl::ConditionallyAvailableSubstitutions::get(
3687-
ctx, VersionRange::empty(), subMapOrError.get()));
3688+
ctx, {{VersionRange::empty(), /*unavailability=*/false}},
3689+
subMapOrError.get()));
36883690

36893691
opaqueDecl->setConditionallyAvailableSubstitutions(limitedAvailability);
36903692
}

lib/Serialization/Serialization.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3953,9 +3953,10 @@ class Serializer::DeclSerializer : public DeclVisitor<DeclSerializer> {
39533953
S.DeclTypeAbbrCodes[ConditionalSubstitutionConditionLayout::Code];
39543954
for (const auto &condition : subs->getAvailability()) {
39553955
ENCODE_VER_TUPLE(osVersion, llvm::Optional<llvm::VersionTuple>(
3956-
condition.getLowerEndpoint()));
3956+
condition.first.getLowerEndpoint()));
39573957
ConditionalSubstitutionConditionLayout::emitRecord(
3958-
S.Out, S.ScratchRecord, condAbbrCode, /*isUnavailable=*/false,
3958+
S.Out, S.ScratchRecord, condAbbrCode,
3959+
/*isUnavailable=*/condition.second,
39593960
LIST_VER_TUPLE_PIECES(osVersion));
39603961
}
39613962
}

0 commit comments

Comments
 (0)