Skip to content

Commit aa782fd

Browse files
authored
Merge pull request #67938 from slavapestov/pack-conformance-availability-5.9
Fix pack conformance availability checking [5.9]
2 parents 898f4a9 + 4f6725c commit aa782fd

File tree

3 files changed

+31
-3
lines changed

3 files changed

+31
-3
lines changed

lib/AST/Module.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1898,15 +1898,17 @@ static ProtocolConformanceRef getPackTypeConformance(
18981898
auto patternConformance =
18991899
(patternType->isTypeParameter()
19001900
? ProtocolConformanceRef(protocol)
1901-
: mod->lookupConformance(patternType, protocol));
1901+
: mod->lookupConformance(patternType, protocol,
1902+
/*allowMissing=*/true));
19021903
patternConformances.push_back(patternConformance);
19031904
continue;
19041905
}
19051906

19061907
auto patternConformance =
19071908
(packElement->isTypeParameter()
19081909
? ProtocolConformanceRef(protocol)
1909-
: mod->lookupConformance(packElement, protocol));
1910+
: mod->lookupConformance(packElement, protocol,
1911+
/*allowMissing=*/true));
19101912
patternConformances.push_back(patternConformance);
19111913
}
19121914

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

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

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