@@ -1919,21 +1919,22 @@ enum class OverrideUnavailabilityStatus {
1919
1919
Ignored,
1920
1920
};
1921
1921
1922
- static std::pair<OverrideUnavailabilityStatus, const AvailableAttr *>
1922
+ static std::pair<OverrideUnavailabilityStatus,
1923
+ std::optional<SemanticAvailableAttr>>
1923
1924
checkOverrideUnavailability (ValueDecl *override , ValueDecl *base) {
1924
1925
if (auto *overrideParent = override ->getDeclContext ()->getAsDecl ()) {
1925
1926
// If the parent of the override is unavailable, then the unavailability of
1926
1927
// the override decl is irrelevant.
1927
1928
if (overrideParent->isSemanticallyUnavailable ())
1928
- return {OverrideUnavailabilityStatus::Ignored, nullptr };
1929
+ return {OverrideUnavailabilityStatus::Ignored, std::nullopt };
1929
1930
}
1930
1931
1931
1932
if (auto *baseAccessor = dyn_cast<AccessorDecl>(base)) {
1932
1933
// Ignore implicit accessors since the diagnostics are likely to duplicate
1933
1934
// the diagnostics for the explicit accessors that availability was inferred
1934
1935
// from.
1935
1936
if (baseAccessor->isImplicit ())
1936
- return {OverrideUnavailabilityStatus::Ignored, nullptr };
1937
+ return {OverrideUnavailabilityStatus::Ignored, std::nullopt };
1937
1938
1938
1939
if (auto *overrideAccessor = dyn_cast<AccessorDecl>(override )) {
1939
1940
// If base and override are accessors, check whether the unavailability of
@@ -1942,18 +1943,17 @@ checkOverrideUnavailability(ValueDecl *override, ValueDecl *base) {
1942
1943
if (checkOverrideUnavailability (overrideAccessor->getStorage (),
1943
1944
baseAccessor->getStorage ())
1944
1945
.first != OverrideUnavailabilityStatus::Compatible)
1945
- return {OverrideUnavailabilityStatus::Ignored, nullptr };
1946
+ return {OverrideUnavailabilityStatus::Ignored, std::nullopt };
1946
1947
}
1947
1948
}
1948
1949
1949
1950
auto baseUnavailableAttr = base->getUnavailableAttr ();
1950
1951
auto overrideUnavailableAttr = override ->getUnavailableAttr ();
1951
1952
1952
1953
if (baseUnavailableAttr && !overrideUnavailableAttr)
1953
- return {OverrideUnavailabilityStatus::BaseUnavailable,
1954
- baseUnavailableAttr->getParsedAttr ()};
1954
+ return {OverrideUnavailabilityStatus::BaseUnavailable, baseUnavailableAttr};
1955
1955
1956
- return {OverrideUnavailabilityStatus::Compatible, nullptr };
1956
+ return {OverrideUnavailabilityStatus::Compatible, std::nullopt };
1957
1957
}
1958
1958
1959
1959
static bool checkSingleOverride (ValueDecl *override , ValueDecl *base) {
@@ -2226,11 +2226,11 @@ static bool checkSingleOverride(ValueDecl *override, ValueDecl *base) {
2226
2226
// FIXME: Possibly should extend to more availability checking.
2227
2227
auto unavailabilityStatusAndAttr =
2228
2228
checkOverrideUnavailability (override , base);
2229
- auto * unavailableAttr = unavailabilityStatusAndAttr.second ;
2229
+ auto unavailableAttr = unavailabilityStatusAndAttr.second ;
2230
2230
2231
2231
switch (unavailabilityStatusAndAttr.first ) {
2232
2232
case OverrideUnavailabilityStatus::BaseUnavailable: {
2233
- diagnoseOverrideOfUnavailableDecl (override , base, unavailableAttr);
2233
+ diagnoseOverrideOfUnavailableDecl (override , base, unavailableAttr. value () );
2234
2234
2235
2235
if (isUnavailableInAllVersions (base)) {
2236
2236
auto modifier = override ->getAttrs ().getAttribute <OverrideAttr>();
0 commit comments