@@ -471,7 +471,6 @@ class AccessControlChecker : public AccessControlCheckerBase,
471
471
UNREACHABLE (Operator, " cannot appear in a type context" )
472
472
UNREACHABLE (PrecedenceGroup, " cannot appear in a type context" )
473
473
UNREACHABLE (Module, " cannot appear in a type context" )
474
- UNREACHABLE (Macro, " cannot appear in a type context" )
475
474
476
475
UNREACHABLE (IfConfig, " does not have access control" )
477
476
UNREACHABLE (PoundDiagnostic, " does not have access control" )
@@ -1056,6 +1055,62 @@ class AccessControlChecker : public AccessControlCheckerBase,
1056
1055
});
1057
1056
}
1058
1057
}
1058
+
1059
+ void visitMacroDecl (MacroDecl *MD) {
1060
+ checkGenericParamAccess (MD, MD);
1061
+
1062
+ auto minAccessScope = AccessScope::getPublic ();
1063
+ const TypeRepr *complainRepr = nullptr ;
1064
+ auto downgradeToWarning = DowngradeToWarning::No;
1065
+ bool problemIsResult = false ;
1066
+
1067
+ if (MD->parameterList ) {
1068
+ for (auto *P : *MD->parameterList ) {
1069
+ checkTypeAccess (
1070
+ P->getInterfaceType (), P->getTypeRepr (), MD, /* mayBeInferred*/ false ,
1071
+ [&](AccessScope typeAccessScope, const TypeRepr *thisComplainRepr,
1072
+ DowngradeToWarning downgradeDiag) {
1073
+ if (typeAccessScope.isChildOf (minAccessScope) ||
1074
+ (!complainRepr &&
1075
+ typeAccessScope.hasEqualDeclContextWith (minAccessScope))) {
1076
+ minAccessScope = typeAccessScope;
1077
+ complainRepr = thisComplainRepr;
1078
+ downgradeToWarning = downgradeDiag;
1079
+ }
1080
+ });
1081
+ }
1082
+ }
1083
+
1084
+ checkTypeAccess (MD->getResultInterfaceType (), MD->resultType .getTypeRepr (),
1085
+ MD, /* mayBeInferred*/ false ,
1086
+ [&](AccessScope typeAccessScope,
1087
+ const TypeRepr *thisComplainRepr,
1088
+ DowngradeToWarning downgradeDiag) {
1089
+ if (typeAccessScope.isChildOf (minAccessScope) ||
1090
+ (!complainRepr &&
1091
+ typeAccessScope.hasEqualDeclContextWith (minAccessScope))) {
1092
+ minAccessScope = typeAccessScope;
1093
+ complainRepr = thisComplainRepr;
1094
+ downgradeToWarning = downgradeDiag;
1095
+ problemIsResult = true ;
1096
+ }
1097
+ });
1098
+
1099
+ if (!minAccessScope.isPublic ()) {
1100
+ auto minAccess = minAccessScope.accessLevelForDiagnostics ();
1101
+ bool isExplicit =
1102
+ MD->getAttrs ().hasAttribute <AccessControlAttr>();
1103
+ auto diagID = diag::macro_type_access;
1104
+ if (downgradeToWarning == DowngradeToWarning::Yes)
1105
+ diagID = diag::macro_type_access_warn;
1106
+ auto macroDeclAccess = isExplicit
1107
+ ? MD->getFormalAccess ()
1108
+ : minAccessScope.requiredAccessForDiagnostics ();
1109
+ auto diag = MD->diagnose (diagID, isExplicit, macroDeclAccess,
1110
+ minAccess, problemIsResult);
1111
+ highlightOffendingType (diag, complainRepr);
1112
+ }
1113
+ }
1059
1114
};
1060
1115
1061
1116
class UsableFromInlineChecker : public AccessControlCheckerBase ,
@@ -1099,7 +1154,6 @@ class UsableFromInlineChecker : public AccessControlCheckerBase,
1099
1154
UNREACHABLE (Operator, " cannot appear in a type context" )
1100
1155
UNREACHABLE (PrecedenceGroup, " cannot appear in a type context" )
1101
1156
UNREACHABLE (Module, " cannot appear in a type context" )
1102
- UNREACHABLE (Macro, " cannot appear in a type context" )
1103
1157
1104
1158
UNREACHABLE (Param, " does not have access control" )
1105
1159
UNREACHABLE (GenericTypeParam, " does not have access control" )
@@ -1118,6 +1172,7 @@ class UsableFromInlineChecker : public AccessControlCheckerBase,
1118
1172
UNINTERESTING (Destructor) // Always correct.
1119
1173
UNINTERESTING (Accessor) // Handled by the Var or Subscript.
1120
1174
UNINTERESTING (OpaqueType) // Handled by the Var or Subscript.
1175
+ UNINTERESTING (Macro)
1121
1176
1122
1177
// / If \p VD's layout is exposed by a @frozen struct or class, return said
1123
1178
// / struct or class.
@@ -1709,7 +1764,6 @@ class DeclAvailabilityChecker : public DeclVisitor<DeclAvailabilityChecker> {
1709
1764
UNREACHABLE (Import, " not applicable" )
1710
1765
UNREACHABLE (TopLevelCode, " not applicable" )
1711
1766
UNREACHABLE (Module, " not applicable" )
1712
- UNREACHABLE (Macro, " not applicable" )
1713
1767
1714
1768
UNREACHABLE (Param, " handled by the enclosing declaration" )
1715
1769
UNREACHABLE (GenericTypeParam, " handled by the enclosing declaration" )
@@ -1906,6 +1960,17 @@ class DeclAvailabilityChecker : public DeclVisitor<DeclAvailabilityChecker> {
1906
1960
checkType (P->getInterfaceType (), P->getTypeRepr (), EED);
1907
1961
}
1908
1962
1963
+ void visitMacroDecl (MacroDecl *MD) {
1964
+ checkGenericParams (MD, MD);
1965
+
1966
+ if (MD->parameterList ) {
1967
+ for (auto P : *MD->parameterList ) {
1968
+ checkType (P->getInterfaceType (), P->getTypeRepr (), MD);
1969
+ }
1970
+ }
1971
+ checkType (MD->getResultInterfaceType (), MD->resultType .getTypeRepr (), MD);
1972
+ }
1973
+
1909
1974
void checkConstrainedExtensionRequirements (ExtensionDecl *ED,
1910
1975
bool hasExportedMembers) {
1911
1976
if (!ED->getTrailingWhereClause ())
0 commit comments