Skip to content

Commit bd5f34f

Browse files
committed
Sema: Availability checking needs to walk into PackConformances
1 parent 85b8f27 commit bd5f34f

File tree

2 files changed

+27
-1
lines changed

2 files changed

+27
-1
lines changed

lib/Sema/TypeCheckAvailability.cpp

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
#include "swift/AST/GenericEnvironment.h"
2424
#include "swift/AST/Initializer.h"
2525
#include "swift/AST/NameLookup.h"
26+
#include "swift/AST/PackConformance.h"
2627
#include "swift/AST/Pattern.h"
2728
#include "swift/AST/PrettyStackTrace.h"
2829
#include "swift/AST/ProtocolConformance.h"
@@ -4011,7 +4012,18 @@ swift::diagnoseConformanceAvailability(SourceLoc loc,
40114012
bool useConformanceAvailabilityErrorsOption) {
40124013
assert(!where.isImplicit());
40134014

4014-
if (!conformance.isConcrete())
4015+
if (conformance.isPack()) {
4016+
bool diagnosed = false;
4017+
auto *pack = conformance.getPack();
4018+
for (auto patternConf : pack->getPatternConformances()) {
4019+
diagnosed |= diagnoseConformanceAvailability(
4020+
loc, patternConf, where, depTy, replacementTy,
4021+
useConformanceAvailabilityErrorsOption);
4022+
}
4023+
return diagnosed;
4024+
}
4025+
4026+
if (conformance.isInvalid() || conformance.isAbstract())
40154027
return false;
40164028

40174029
const ProtocolConformance *concreteConf = conformance.getConcrete();
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
// RUN: %target-typecheck-verify-swift
2+
3+
func f<each T: P>(_: repeat each T) {}
4+
5+
protocol P {}
6+
7+
struct S {}
8+
9+
@available(*, unavailable)
10+
extension S: P {}
11+
// expected-note@-1 {{conformance of 'S' to 'P' has been explicitly marked unavailable here}}
12+
13+
f(S())
14+
// expected-error@-1 {{conformance of 'S' to 'P' is unavailable}}

0 commit comments

Comments
 (0)