@@ -39,6 +39,33 @@ enum class DowngradeToWarning: bool {
3939 Yes
4040};
4141
42+ // / Calls \p callback for each type in each requirement provided by
43+ // / \p source.
44+ static void forAllRequirementTypes (
45+ WhereClauseOwner source,
46+ llvm::function_ref<void (Type, TypeRepr *)> callback) {
47+ RequirementRequest::visitRequirements (
48+ source, TypeResolutionStage::Interface,
49+ [&](const Requirement &req, RequirementRepr* reqRepr) {
50+ switch (req.getKind ()) {
51+ case RequirementKind::Conformance:
52+ case RequirementKind::SameType:
53+ case RequirementKind::Superclass:
54+ callback (req.getFirstType (),
55+ RequirementRepr::getFirstTypeRepr (reqRepr));
56+ callback (req.getSecondType (),
57+ RequirementRepr::getSecondTypeRepr (reqRepr));
58+ break ;
59+
60+ case RequirementKind::Layout:
61+ callback (req.getFirstType (),
62+ RequirementRepr::getFirstTypeRepr (reqRepr));
63+ break ;
64+ }
65+ return false ;
66+ });
67+ }
68+
4269// / \see checkTypeAccess
4370using CheckTypeAccessCallback =
4471 void (AccessScope, const TypeRepr *, DowngradeToWarning);
@@ -69,7 +96,12 @@ class AccessControlCheckerBase {
6996 WhereClauseOwner source,
7097 AccessScope accessScope,
7198 const DeclContext *useDC,
72- llvm::function_ref<CheckTypeAccessCallback> diagnose);
99+ llvm::function_ref<CheckTypeAccessCallback> diagnose) {
100+ forAllRequirementTypes (source, [&](Type type, TypeRepr *typeRepr) {
101+ checkTypeAccessImpl (type, typeRepr, accessScope, useDC,
102+ /* mayBeInferred*/ false , diagnose);
103+ });
104+ }
73105
74106 AccessControlCheckerBase (TypeChecker &TC, bool checkUsableFromInline)
75107 : TC(TC), checkUsableFromInline(checkUsableFromInline) {}
@@ -280,39 +312,6 @@ static void highlightOffendingType(TypeChecker &TC, InFlightDiagnostic &diag,
280312 }
281313}
282314
283- void AccessControlCheckerBase::checkRequirementAccess (
284- WhereClauseOwner source,
285- AccessScope accessScope,
286- const DeclContext *useDC,
287- llvm::function_ref<CheckTypeAccessCallback> diagnose) {
288- RequirementRequest::visitRequirements (
289- source, TypeResolutionStage::Interface,
290- [&](const Requirement &req, RequirementRepr* reqRepr) {
291- switch (req.getKind ()) {
292- case RequirementKind::Conformance:
293- case RequirementKind::SameType:
294- case RequirementKind::Superclass:
295- checkTypeAccessImpl (req.getFirstType (),
296- RequirementRepr::getFirstTypeRepr (reqRepr),
297- accessScope, useDC, /* mayBeInferred*/ false ,
298- diagnose);
299- checkTypeAccessImpl (req.getSecondType (),
300- RequirementRepr::getSecondTypeRepr (reqRepr),
301- accessScope, useDC, /* mayBeInferred*/ false ,
302- diagnose);
303- break ;
304-
305- case RequirementKind::Layout:
306- checkTypeAccessImpl (req.getFirstType (),
307- RequirementRepr::getFirstTypeRepr (reqRepr),
308- accessScope, useDC, /* mayBeInferred*/ false ,
309- diagnose);
310- break ;
311- }
312- return false ;
313- });
314- }
315-
316315void AccessControlCheckerBase::checkGenericParamAccess (
317316 const GenericParamList *params,
318317 const Decl *owner,
0 commit comments