Skip to content

Commit 8b59e13

Browse files
authored
Merge pull request #37233 from slavapestov/unavailable-conformance-fix
Sema: Allow unavailable conformances to be referenced from unavailable contexts
2 parents 8fa62ed + daceb16 commit 8b59e13

File tree

2 files changed

+18
-5
lines changed

2 files changed

+18
-5
lines changed

lib/Sema/TypeCheckAvailability.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1737,7 +1737,8 @@ static bool isInsideCompatibleUnavailableDeclaration(
17371737
// but allow the use of types.
17381738
PlatformKind platform = attr->Platform;
17391739
if (platform == PlatformKind::none &&
1740-
!isa<TypeDecl>(D)) {
1740+
!isa<TypeDecl>(D) &&
1741+
!isa<ExtensionDecl>(D)) {
17411742
return false;
17421743
}
17431744

test/Sema/conformance_availability.swift

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ public struct HasUnavailableConformance1 {}
1616

1717
@available(*, unavailable)
1818
extension HasUnavailableConformance1 : Horse {}
19-
// expected-note@-1 7{{conformance of 'HasUnavailableConformance1' to 'Horse' has been explicitly marked unavailable here}}
19+
// expected-note@-1 4{{conformance of 'HasUnavailableConformance1' to 'Horse' has been explicitly marked unavailable here}}
2020

2121
func passUnavailableConformance1(x: HasUnavailableConformance1) {
2222
takesHorse(x) // expected-error {{conformance of 'HasUnavailableConformance1' to 'Horse' is unavailable}}
@@ -26,9 +26,9 @@ func passUnavailableConformance1(x: HasUnavailableConformance1) {
2626

2727
@available(*, unavailable)
2828
func passUnavailableConformance1a(x: HasUnavailableConformance1) {
29-
takesHorse(x) // expected-error {{conformance of 'HasUnavailableConformance1' to 'Horse' is unavailable}}
30-
x.giddyUp() // expected-error {{conformance of 'HasUnavailableConformance1' to 'Horse' is unavailable}}
31-
_ = UsesHorse<HasUnavailableConformance1>.self // expected-error {{conformance of 'HasUnavailableConformance1' to 'Horse' is unavailable}}
29+
takesHorse(x)
30+
x.giddyUp()
31+
_ = UsesHorse<HasUnavailableConformance1>.self
3232
}
3333

3434
// Platform unavailability
@@ -351,3 +351,15 @@ extension Car {
351351
@available(macOS 100, *)
352352
extension ClownCar : Vehicle {}
353353
// expected-error@-1 {{protocol 'Vehicle' requires 'move()' to be available in macOS 100 and newer}}
354+
355+
// rdar://problem/75430966 - Allow using unavailable conformances from unavailable contexts.
356+
@available(*, unavailable)
357+
public enum UnavailableEnum {
358+
case horse
359+
}
360+
361+
@available(*, unavailable)
362+
extension UnavailableEnum : Swift.Equatable {}
363+
364+
@available(*, unavailable)
365+
extension UnavailableEnum : Swift.Hashable {}

0 commit comments

Comments
 (0)