Skip to content

Commit ee0402d

Browse files
authored
Merge pull request #39446 from DougGregor/back-deploy-concurrency-cleanups-5.5
Back-deploymed concurrency availability fixes
2 parents b03cde6 + 5cc1ac0 commit ee0402d

File tree

4 files changed

+29
-9
lines changed

4 files changed

+29
-9
lines changed

lib/AST/Availability.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -259,7 +259,7 @@ AvailabilityContext ASTContext::getSwift50Availability() {
259259
return AvailabilityContext(
260260
VersionRange::allGTE(llvm::VersionTuple(12,2)));
261261
} else if (target.isWatchOS()) {
262-
if (target.getArch() == llvm::Triple::ArchType::x86_64)
262+
if (target.isArch64Bit())
263263
return AvailabilityContext::alwaysAvailable();
264264

265265
return AvailabilityContext(
@@ -297,6 +297,9 @@ AvailabilityContext ASTContext::getSwift51Availability() {
297297
return AvailabilityContext(
298298
VersionRange::allGTE(llvm::VersionTuple(13,0,0)));
299299
} else if (target.isWatchOS()) {
300+
if (target.isArch64Bit())
301+
return AvailabilityContext::alwaysAvailable();
302+
300303
return AvailabilityContext(
301304
VersionRange::allGTE(llvm::VersionTuple(6,0,0)));
302305
} else {

lib/Basic/Platform.cpp

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -417,14 +417,20 @@ swift::getSwiftRuntimeCompatibilityVersionForTarget(
417417
}
418418
}
419419
} else if (Triple.isWatchOS()) {
420+
auto floorFor64bits = [&Triple](llvm::VersionTuple v) {
421+
if (!Triple.isArch64Bit()) return v;
422+
// 64-bit watchOS was introduced with Swift 5.3
423+
return MAX(v, llvm::VersionTuple(5, 3));
424+
};
425+
420426
Triple.getWatchOSVersion(Major, Minor, Micro);
421427
if (Major <= 5) {
422-
return llvm::VersionTuple(5, 0);
428+
return floorFor64bits(llvm::VersionTuple(5, 0));
423429
} else if (Major <= 6) {
424430
if (Minor <= 1) {
425-
return llvm::VersionTuple(5, 1);
431+
return floorFor64bits(llvm::VersionTuple(5, 1));
426432
} else {
427-
return llvm::VersionTuple(5, 2);
433+
return floorFor64bits(llvm::VersionTuple(5, 2));
428434
}
429435
}
430436
}

lib/Sema/DerivedConformanceActor.cpp

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -153,11 +153,14 @@ static ValueDecl *deriveActor_unownedExecutor(DerivedConformance &derived) {
153153
if (property->getFormalAccess() == AccessLevel::Open)
154154
property->overwriteAccess(AccessLevel::Public);
155155

156-
// Clone any @available attributes from UnownedSerialExecutor.
157-
// Really, though, the whole actor probably needs to be marked as
158-
// unavailable.
159-
for (auto attr: executorDecl->getAttrs().getAttributes<AvailableAttr>())
160-
property->getAttrs().add(attr->clone(ctx, /*implicit*/true));
156+
// Infer availability.
157+
SmallVector<const Decl *, 2> asAvailableAs;
158+
asAvailableAs.push_back(executorDecl);
159+
if (auto enclosingDecl = property->getInnermostDeclWithAvailability())
160+
asAvailableAs.push_back(enclosingDecl);
161+
162+
AvailabilityInference::applyInferredAvailableAttrs(
163+
property, asAvailableAs, ctx);
161164

162165
auto getter =
163166
derived.addGetterToReadOnlyDerivedProperty(property, executorType);

test/Concurrency/concurrency_availability.swift

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,3 +11,11 @@ actor A { } // expected-error{{concurrency is only available in}}
1111
// Allow this without any availability for Historical Reasons.
1212
public func swift_deletedAsyncMethodError() async {
1313
}
14+
15+
// Ensure that our synthesis of the actor's unownedExecutor does not cause
16+
// availability errors.
17+
@available(macOS 12.0, *)
18+
struct S {
19+
actor A {
20+
}
21+
}

0 commit comments

Comments
 (0)