Skip to content

Commit 661e861

Browse files
committed
Sema: Availability checking needs to walk into PackConformances
1 parent 2211b2c commit 661e861

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"
@@ -4061,7 +4062,18 @@ swift::diagnoseConformanceAvailability(SourceLoc loc,
40614062
bool useConformanceAvailabilityErrorsOption) {
40624063
assert(!where.isImplicit());
40634064

4064-
if (!conformance.isConcrete())
4065+
if (conformance.isPack()) {
4066+
bool diagnosed = false;
4067+
auto *pack = conformance.getPack();
4068+
for (auto patternConf : pack->getPatternConformances()) {
4069+
diagnosed |= diagnoseConformanceAvailability(
4070+
loc, patternConf, where, depTy, replacementTy,
4071+
useConformanceAvailabilityErrorsOption);
4072+
}
4073+
return diagnosed;
4074+
}
4075+
4076+
if (conformance.isInvalid() || conformance.isAbstract())
40654077
return false;
40664078

40674079
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)