Skip to content

Commit f0a7358

Browse files
authored
Merge pull request swiftlang#42528 from beccadax/rdar91940820
2 parents d23c89b + 8bbfaf3 commit f0a7358

File tree

6 files changed

+73
-15
lines changed

6 files changed

+73
-15
lines changed

lib/AST/DeclContext.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
#include "llvm/ADT/Statistic.h"
3131
#include "llvm/Support/raw_ostream.h"
3232
#include "llvm/Support/SaveAndRestore.h"
33+
#include "clang/AST/ASTContext.h"
3334
using namespace swift;
3435

3536
#define DEBUG_TYPE "Name lookup"
@@ -734,6 +735,14 @@ unsigned DeclContext::printContext(raw_ostream &OS, const unsigned indent,
734735
}
735736
}
736737

738+
if (auto decl = getAsDecl())
739+
if (decl->getClangNode().getLocation().isValid()) {
740+
auto &clangSM = getASTContext().getClangModuleLoader()
741+
->getClangASTContext().getSourceManager();
742+
OS << " clang_loc=";
743+
decl->getClangNode().getLocation().print(OS, clangSM);
744+
}
745+
737746
if (!onlyAPartialLine)
738747
OS << "\n";
739748
return Depth + 1;

lib/Sema/ResilienceDiagnostics.cpp

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -158,7 +158,8 @@ bool
158158
TypeChecker::diagnoseConformanceExportability(SourceLoc loc,
159159
const RootProtocolConformance *rootConf,
160160
const ExtensionDecl *ext,
161-
const ExportContext &where) {
161+
const ExportContext &where,
162+
bool useConformanceAvailabilityErrorsOption) {
162163
if (!where.mustOnlyReferenceExportedDecls())
163164
return false;
164165

@@ -178,6 +179,9 @@ TypeChecker::diagnoseConformanceExportability(SourceLoc loc,
178179
rootConf->getProtocol()->getName(),
179180
static_cast<unsigned>(*reason),
180181
M->getName(),
181-
static_cast<unsigned>(originKind));
182+
static_cast<unsigned>(originKind))
183+
.warnUntilSwiftVersionIf(useConformanceAvailabilityErrorsOption &&
184+
!ctx.LangOpts.EnableConformanceAvailabilityErrors,
185+
6);
182186
return true;
183187
}

lib/Sema/TypeCheckAvailability.cpp

Lines changed: 20 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2584,7 +2584,8 @@ bool swift::diagnoseExplicitUnavailability(const ValueDecl *D, SourceRange R,
25842584
bool swift::diagnoseExplicitUnavailability(SourceLoc loc,
25852585
const RootProtocolConformance *rootConf,
25862586
const ExtensionDecl *ext,
2587-
const ExportContext &where) {
2587+
const ExportContext &where,
2588+
bool useConformanceAvailabilityErrorsOption) {
25882589
auto *attr = AvailableAttr::isUnavailable(ext);
25892590
if (!attr)
25902591
return false;
@@ -2641,7 +2642,10 @@ bool swift::diagnoseExplicitUnavailability(SourceLoc loc,
26412642
diags.diagnose(loc, diag::conformance_availability_unavailable,
26422643
type, proto,
26432644
platform.empty(), platform, EncodedMessage.Message)
2644-
.limitBehavior(behavior);
2645+
.limitBehavior(behavior)
2646+
.warnUntilSwiftVersionIf(useConformanceAvailabilityErrorsOption &&
2647+
!ctx.LangOpts.EnableConformanceAvailabilityErrors,
2648+
6);
26452649

26462650
switch (attr->getVersionAvailability(ctx)) {
26472651
case AvailableVersionComparison::Available:
@@ -2995,7 +2999,8 @@ class ExprAvailabilityWalker : public ASTWalker {
29952999

29963000
if (auto EE = dyn_cast<ErasureExpr>(E)) {
29973001
for (ProtocolConformanceRef C : EE->getConformances()) {
2998-
diagnoseConformanceAvailability(E->getLoc(), C, Where);
3002+
diagnoseConformanceAvailability(E->getLoc(), C, Where, Type(), Type(),
3003+
/*useConformanceAvailabilityErrorsOpt=*/true);
29993004
}
30003005
}
30013006

@@ -3777,7 +3782,8 @@ bool
37773782
swift::diagnoseConformanceAvailability(SourceLoc loc,
37783783
ProtocolConformanceRef conformance,
37793784
const ExportContext &where,
3780-
Type depTy, Type replacementTy) {
3785+
Type depTy, Type replacementTy,
3786+
bool useConformanceAvailabilityErrorsOption) {
37813787
assert(!where.isImplicit());
37823788

37833789
if (!conformance.isConcrete())
@@ -3811,12 +3817,14 @@ swift::diagnoseConformanceAvailability(SourceLoc loc,
38113817
};
38123818

38133819
if (auto *ext = dyn_cast<ExtensionDecl>(rootConf->getDeclContext())) {
3814-
if (TypeChecker::diagnoseConformanceExportability(loc, rootConf, ext, where)) {
3820+
if (TypeChecker::diagnoseConformanceExportability(loc, rootConf, ext, where,
3821+
useConformanceAvailabilityErrorsOption)) {
38153822
maybeEmitAssociatedTypeNote();
38163823
return true;
38173824
}
38183825

3819-
if (diagnoseExplicitUnavailability(loc, rootConf, ext, where)) {
3826+
if (diagnoseExplicitUnavailability(loc, rootConf, ext, where,
3827+
useConformanceAvailabilityErrorsOption)) {
38203828
maybeEmitAssociatedTypeNote();
38213829
return true;
38223830
}
@@ -3844,7 +3852,8 @@ swift::diagnoseConformanceAvailability(SourceLoc loc,
38443852
SubstitutionMap subConformanceSubs =
38453853
concreteConf->getSubstitutions(DC->getParentModule());
38463854
if (diagnoseSubstitutionMapAvailability(loc, subConformanceSubs, where,
3847-
depTy, replacementTy))
3855+
depTy, replacementTy,
3856+
useConformanceAvailabilityErrorsOption))
38483857
return true;
38493858

38503859
return false;
@@ -3854,11 +3863,13 @@ bool
38543863
swift::diagnoseSubstitutionMapAvailability(SourceLoc loc,
38553864
SubstitutionMap subs,
38563865
const ExportContext &where,
3857-
Type depTy, Type replacementTy) {
3866+
Type depTy, Type replacementTy,
3867+
bool useConformanceAvailabilityErrorsOption) {
38583868
bool hadAnyIssues = false;
38593869
for (ProtocolConformanceRef conformance : subs.getConformances()) {
38603870
if (diagnoseConformanceAvailability(loc, conformance, where,
3861-
depTy, replacementTy))
3871+
depTy, replacementTy,
3872+
useConformanceAvailabilityErrorsOption))
38623873
hadAnyIssues = true;
38633874
}
38643875
return hadAnyIssues;

lib/Sema/TypeCheckAvailability.h

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -220,14 +220,16 @@ diagnoseConformanceAvailability(SourceLoc loc,
220220
ProtocolConformanceRef conformance,
221221
const ExportContext &context,
222222
Type depTy=Type(),
223-
Type replacementTy=Type());
223+
Type replacementTy=Type(),
224+
bool useConformanceAvailabilityErrorsOption = false);
224225

225226
bool
226227
diagnoseSubstitutionMapAvailability(SourceLoc loc,
227228
SubstitutionMap subs,
228229
const ExportContext &context,
229230
Type depTy=Type(),
230-
Type replacementTy=Type());
231+
Type replacementTy=Type(),
232+
bool useConformanceAvailabilityErrorsOption = false);
231233

232234
/// Diagnose uses of unavailable declarations. Returns true if a diagnostic
233235
/// was emitted.
@@ -261,7 +263,8 @@ bool diagnoseExplicitUnavailability(
261263
SourceLoc loc,
262264
const RootProtocolConformance *rootConf,
263265
const ExtensionDecl *ext,
264-
const ExportContext &where);
266+
const ExportContext &where,
267+
bool useConformanceAvailabilityErrorsOption = false);
265268

266269
/// Check if \p decl has a introduction version required by -require-explicit-availability
267270
void checkExplicitAvailability(Decl *decl);

lib/Sema/TypeChecker.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -999,7 +999,8 @@ bool diagnoseDeclRefExportability(SourceLoc loc,
999999
bool diagnoseConformanceExportability(SourceLoc loc,
10001000
const RootProtocolConformance *rootConf,
10011001
const ExtensionDecl *ext,
1002-
const ExportContext &where);
1002+
const ExportContext &where,
1003+
bool useConformanceAvailabilityErrorsOpt = false);
10031004

10041005
/// \name Availability checking
10051006
///

test/Sema/conformance_availability_warn.swift

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,3 +52,33 @@ func passAvailableConformance1a(x: HasAvailableConformance1) {
5252
_ = x.isGalloping
5353
_ = UsesHorse<HasAvailableConformance1>.self
5454
}
55+
56+
// Explicit unavailability
57+
public struct HasAvailableConformance2 {}
58+
59+
@available(*, unavailable)
60+
extension HasAvailableConformance2 : Horse {} // expected-note 6 {{conformance of 'HasAvailableConformance2' to 'Horse' has been explicitly marked unavailable here}}
61+
62+
// Some availability diagnostics become warnings in Swift 5 mode without
63+
// -enable-conformance-availability-errors because they were incorrectly
64+
// accepted before and rejecting them would break source compatibility. Others
65+
// are unaffected because they have always been rejected.
66+
67+
func passAvailableConformance2(x: HasAvailableConformance2) {
68+
takesHorse(x) // expected-error {{conformance of 'HasAvailableConformance2' to 'Horse' is unavailable}}
69+
takesHorseExistential(x) // expected-warning {{conformance of 'HasAvailableConformance2' to 'Horse' is unavailable; this is an error in Swift 6}}
70+
x.giddyUp() // expected-error {{conformance of 'HasAvailableConformance2' to 'Horse' is unavailable}}
71+
_ = x.isGalloping // expected-error {{conformance of 'HasAvailableConformance2' to 'Horse' is unavailable}}
72+
_ = x[keyPath: \.isGalloping] // expected-error {{conformance of 'HasAvailableConformance2' to 'Horse' is unavailable}}
73+
_ = UsesHorse<HasAvailableConformance2>.self // expected-error {{conformance of 'HasAvailableConformance2' to 'Horse' is unavailable}}
74+
}
75+
76+
@available(*, unavailable)
77+
func passAvailableConformance2a(x: HasAvailableConformance2) {
78+
takesHorse(x)
79+
takesHorseExistential(x)
80+
x.giddyUp()
81+
_ = x.isGalloping
82+
_ = UsesHorse<HasAvailableConformance2>.self
83+
}
84+

0 commit comments

Comments
 (0)