1616
1717#include " TypeChecker.h"
1818#include " TypeCheckAvailability.h"
19+ #include " TypeCheckAccess.h"
1920#include " swift/AST/Attr.h"
2021#include " swift/AST/Decl.h"
2122#include " swift/AST/DeclContext.h"
@@ -171,7 +172,8 @@ static bool diagnoseDeclExportability(SourceLoc loc, const ValueDecl *D,
171172static bool
172173diagnoseGenericArgumentsExportability (SourceLoc loc,
173174 SubstitutionMap subs,
174- const SourceFile &userSF) {
175+ const SourceFile &userSF,
176+ const DeclContext *userDC) {
175177 bool hadAnyIssues = false ;
176178 for (ProtocolConformanceRef conformance : subs.getConformances ()) {
177179 if (!conformance.isConcrete ())
@@ -180,18 +182,23 @@ diagnoseGenericArgumentsExportability(SourceLoc loc,
180182
181183 SubstitutionMap subConformanceSubs =
182184 concreteConf->getSubstitutions (userSF.getParentModule ());
183- diagnoseGenericArgumentsExportability (loc, subConformanceSubs, userSF);
185+ diagnoseGenericArgumentsExportability (loc, subConformanceSubs, userSF, userDC );
184186
185187 const RootProtocolConformance *rootConf =
186188 concreteConf->getRootConformance ();
187189 ModuleDecl *M = rootConf->getDeclContext ()->getParentModule ();
188- if (!userSF.isImportedImplementationOnly (M))
190+
191+ auto originKind = getDisallowedOriginKind (
192+ rootConf->getDeclContext ()->getAsDecl (),
193+ userSF, userDC->getInnermostDeclarationDeclContext ());
194+ if (originKind == DisallowedOriginKind::None)
189195 continue ;
190196
191197 ASTContext &ctx = M->getASTContext ();
192198 ctx.Diags .diagnose (loc, diag::conformance_from_implementation_only_module,
193199 rootConf->getType (),
194- rootConf->getProtocol ()->getName (), 0 , M->getName ());
200+ rootConf->getProtocol ()->getName (), 0 , M->getName (),
201+ static_cast <unsigned >(originKind));
195202 hadAnyIssues = true ;
196203 }
197204 return hadAnyIssues;
@@ -209,10 +216,10 @@ void TypeChecker::diagnoseGenericTypeExportability(SourceLoc Loc, Type T,
209216 if (auto *BGT = dyn_cast<BoundGenericType>(T.getPointer ())) {
210217 ModuleDecl *useModule = SF->getParentModule ();
211218 auto subs = T->getContextSubstitutionMap (useModule, BGT->getDecl ());
212- (void )diagnoseGenericArgumentsExportability (Loc, subs, *SF);
219+ (void )diagnoseGenericArgumentsExportability (Loc, subs, *SF, DC );
213220 } else if (auto *TAT = dyn_cast<TypeAliasType>(T.getPointer ())) {
214221 auto subs = TAT->getSubstitutionMap ();
215- (void )diagnoseGenericArgumentsExportability (Loc, subs, *SF);
222+ (void )diagnoseGenericArgumentsExportability (Loc, subs, *SF, DC );
216223 }
217224}
218225
@@ -226,19 +233,11 @@ TypeChecker::diagnoseDeclRefExportability(SourceLoc loc,
226233 if (!userSF)
227234 return false ;
228235
229- // If the source file doesn't have any implementation-only imports,
230- // we can fast-path this. In the current language design, we never
231- // need to consider the possibility of implementation-only imports
232- // from other source files in the module (or indirectly in other modules).
233- // TODO: maybe check whether D is from a bridging header?
234- if (!userSF->hasImplementationOnlyImports ())
235- return false ;
236-
237236 const ValueDecl *D = declRef.getDecl ();
238237 if (diagnoseDeclExportability (loc, D, *userSF, fragileKind))
239238 return true ;
240239 if (diagnoseGenericArgumentsExportability (loc, declRef.getSubstitutions (),
241- *userSF)) {
240+ *userSF, DC )) {
242241 return true ;
243242 }
244243 return false ;
0 commit comments