@@ -1828,8 +1828,8 @@ static void highlightOffendingType(TypeChecker &TC, InFlightDiagnostic &diag,
1828
1828
1829
1829
static void checkRequirementAccess (TypeChecker &TC,
1830
1830
ArrayRef<RequirementRepr> requirements,
1831
- const DeclContext *useDC,
1832
1831
AccessScope accessScope,
1832
+ const DeclContext *useDC,
1833
1833
llvm::function_ref<CheckTypeAccessCallback> diagnose) {
1834
1834
for (auto &requirement : requirements) {
1835
1835
switch (requirement.getKind ()) {
@@ -1897,7 +1897,7 @@ static void checkGenericParamAccess(TypeChecker &TC,
1897
1897
callbackACEK = ACEK::Requirement;
1898
1898
1899
1899
checkRequirementAccess (TC, params->getRequirements (),
1900
- owner->getDeclContext (), accessScope ,
1900
+ accessScope, owner->getDeclContext (),
1901
1901
callback);
1902
1902
1903
1903
if (minAccessScope.isPublic ())
@@ -2113,6 +2113,29 @@ static void checkAccessControl(TypeChecker &TC, const Decl *D) {
2113
2113
}
2114
2114
});
2115
2115
2116
+ if (auto *trailingWhereClause = assocType->getTrailingWhereClause ()) {
2117
+ checkRequirementAccess (TC, trailingWhereClause->getRequirements (),
2118
+ assocType->getFormalAccessScope (),
2119
+ assocType->getDeclContext (),
2120
+ [&](AccessScope typeAccessScope,
2121
+ const TypeRepr *thisComplainRepr,
2122
+ DowngradeToWarning downgradeDiag) {
2123
+ if (typeAccessScope.isChildOf (minAccessScope) ||
2124
+ (!complainRepr &&
2125
+ typeAccessScope.hasEqualDeclContextWith (minAccessScope))) {
2126
+ minAccessScope = typeAccessScope;
2127
+ complainRepr = thisComplainRepr;
2128
+ accessControlErrorKind = ACEK_Requirement;
2129
+ downgradeToWarning = downgradeDiag;
2130
+
2131
+ // Swift versions before 5.0 did not check requirements on the
2132
+ // protocol's where clause, so emit a warning.
2133
+ if (!TC.Context .isSwiftVersionAtLeast (5 ))
2134
+ downgradeToWarning = DowngradeToWarning::Yes;
2135
+ }
2136
+ });
2137
+ }
2138
+
2116
2139
if (!minAccessScope.isPublic ()) {
2117
2140
auto minAccess = minAccessScope.accessLevelForDiagnostics ();
2118
2141
auto diagID = diag::associated_type_access;
@@ -2232,6 +2255,12 @@ static void checkAccessControl(TypeChecker &TC, const Decl *D) {
2232
2255
case DeclKind::Protocol: {
2233
2256
auto proto = cast<ProtocolDecl>(D);
2234
2257
2258
+ // This must stay in sync with diag::protocol_access.
2259
+ enum {
2260
+ PCEK_Refine = 0 ,
2261
+ PCEK_Requirement
2262
+ } protocolControlErrorKind;
2263
+
2235
2264
auto minAccessScope = AccessScope::getPublic ();
2236
2265
const TypeRepr *complainRepr = nullptr ;
2237
2266
auto downgradeToWarning = DowngradeToWarning::No;
@@ -2248,19 +2277,47 @@ static void checkAccessControl(TypeChecker &TC, const Decl *D) {
2248
2277
typeAccessScope.hasEqualDeclContextWith (minAccessScope))) {
2249
2278
minAccessScope = typeAccessScope;
2250
2279
complainRepr = thisComplainRepr;
2280
+ protocolControlErrorKind = PCEK_Refine;
2251
2281
downgradeToWarning = downgradeDiag;
2252
2282
}
2253
2283
});
2254
2284
});
2255
2285
2286
+ if (auto *trailingWhereClause = proto->getTrailingWhereClause ()) {
2287
+ checkRequirementAccess (TC, trailingWhereClause->getRequirements (),
2288
+ proto->getFormalAccessScope (),
2289
+ proto->getDeclContext (),
2290
+ [&](AccessScope typeAccessScope,
2291
+ const TypeRepr *thisComplainRepr,
2292
+ DowngradeToWarning downgradeDiag) {
2293
+ if (typeAccessScope.isChildOf (minAccessScope) ||
2294
+ (!complainRepr &&
2295
+ typeAccessScope.hasEqualDeclContextWith (minAccessScope))) {
2296
+ minAccessScope = typeAccessScope;
2297
+ complainRepr = thisComplainRepr;
2298
+ protocolControlErrorKind = PCEK_Requirement;
2299
+ downgradeToWarning = downgradeDiag;
2300
+
2301
+ // Swift versions before 5.0 did not check requirements on the
2302
+ // protocol's where clause, so emit a warning.
2303
+ if (!TC.Context .isSwiftVersionAtLeast (5 ))
2304
+ downgradeToWarning = DowngradeToWarning::Yes;
2305
+ }
2306
+ });
2307
+ }
2308
+
2256
2309
if (!minAccessScope.isPublic ()) {
2257
2310
auto minAccess = minAccessScope.accessLevelForDiagnostics ();
2258
2311
bool isExplicit = proto->getAttrs ().hasAttribute <AccessControlAttr>();
2259
- auto diagID = diag::protocol_refine_access;
2312
+ auto protoAccess = isExplicit
2313
+ ? proto->getFormalAccess ()
2314
+ : minAccessScope.requiredAccessForDiagnostics ();
2315
+ auto diagID = diag::protocol_access;
2260
2316
if (downgradeToWarning == DowngradeToWarning::Yes)
2261
- diagID = diag::protocol_refine_access_warn ;
2317
+ diagID = diag::protocol_access_warn ;
2262
2318
auto diag = TC.diagnose (proto, diagID,
2263
- isExplicit, proto->getFormalAccess (), minAccess,
2319
+ isExplicit, protoAccess,
2320
+ protocolControlErrorKind, minAccess,
2264
2321
isa<FileUnit>(proto->getDeclContext ()));
2265
2322
highlightOffendingType (TC, diag, complainRepr);
2266
2323
}
0 commit comments