@@ -2330,22 +2330,27 @@ ObjCCategoryNameMap ClassDecl::getObjCCategoryNameMap() {
23302330 ObjCCategoryNameMap ());
23312331}
23322332
2333- static bool missingImportForMemberDecl ( const DeclContext *dc, ValueDecl *decl) {
2334- // Only require explicit imports for members when MemberImportVisibility is
2335- // enabled.
2336- auto &ctx = dc ->getASTContext ();
2333+ // / Determines whether MemberImportVisiblity should be enforced for lookups in
2334+ // / the given context.
2335+ static bool shouldRequireImportsInContext ( const DeclContext *lookupContext) {
2336+ auto &ctx = lookupContext ->getASTContext ();
23372337 if (!ctx.LangOpts .hasFeature (Feature::MemberImportVisibility))
23382338 return false ;
23392339
2340- return !dc->isDeclImported (decl);
2340+ // Code outside of the main module (which is often synthesized) isn't subject
2341+ // to MemberImportVisibility rules.
2342+ if (lookupContext->getParentModule () != ctx.MainModule )
2343+ return false ;
2344+
2345+ return true ;
23412346}
23422347
23432348// / Determine whether the given declaration is an acceptable lookup
23442349// / result when searching from the given DeclContext.
2345- static bool isAcceptableLookupResult (const DeclContext *dc,
2346- NLOptions options,
2350+ static bool isAcceptableLookupResult (const DeclContext *dc, NLOptions options,
23472351 ValueDecl *decl,
2348- bool onlyCompleteObjectInits) {
2352+ bool onlyCompleteObjectInits,
2353+ bool requireImport) {
23492354 // Filter out designated initializers, if requested.
23502355 if (onlyCompleteObjectInits) {
23512356 if (auto ctor = dyn_cast<ConstructorDecl>(decl)) {
@@ -2373,10 +2378,9 @@ static bool isAcceptableLookupResult(const DeclContext *dc,
23732378
23742379 // Check that there is some import in the originating context that makes this
23752380 // decl visible.
2376- if (!(options & NL_IgnoreMissingImports)) {
2377- if (missingImportForMemberDecl (dc, decl))
2381+ if (requireImport && !(options & NL_IgnoreMissingImports))
2382+ if (!dc-> isDeclImported ( decl))
23782383 return false ;
2379- }
23802384
23812385 return true ;
23822386}
@@ -2593,6 +2597,9 @@ QualifiedLookupRequest::evaluate(Evaluator &eval, const DeclContext *DC,
25932597 // Whether we only want to return complete object initializers.
25942598 bool onlyCompleteObjectInits = false ;
25952599
2600+ // Whether to enforce MemberImportVisibility import restrictions.
2601+ bool requireImport = shouldRequireImportsInContext (DC);
2602+
25962603 // Visit all of the nominal types we know about, discovering any others
25972604 // we need along the way.
25982605 bool wantProtocolMembers = (options & NL_ProtocolMembers);
@@ -2625,7 +2632,8 @@ QualifiedLookupRequest::evaluate(Evaluator &eval, const DeclContext *DC,
26252632 if ((options & NL_OnlyMacros) && !isa<MacroDecl>(decl))
26262633 continue ;
26272634
2628- if (isAcceptableLookupResult (DC, options, decl, onlyCompleteObjectInits))
2635+ if (isAcceptableLookupResult (DC, options, decl, onlyCompleteObjectInits,
2636+ requireImport))
26292637 decls.push_back (decl);
26302638 }
26312639
@@ -2762,6 +2770,9 @@ AnyObjectLookupRequest::evaluate(Evaluator &evaluator, const DeclContext *dc,
27622770 member.getFullName (), allDecls);
27632771 }
27642772
2773+ // / Whether to enforce MemberImportVisibility import restrictions.
2774+ bool requireImport = shouldRequireImportsInContext (dc);
2775+
27652776 // For each declaration whose context is not something we've
27662777 // already visited above, add it to the list of declarations.
27672778 llvm::SmallPtrSet<ValueDecl *, 4 > knownDecls;
@@ -2794,7 +2805,8 @@ AnyObjectLookupRequest::evaluate(Evaluator &evaluator, const DeclContext *dc,
27942805 // result, add it to the list.
27952806 if (knownDecls.insert (decl).second &&
27962807 isAcceptableLookupResult (dc, options, decl,
2797- /* onlyCompleteObjectInits=*/ false ))
2808+ /* onlyCompleteObjectInits=*/ false ,
2809+ requireImport))
27982810 decls.push_back (decl);
27992811 }
28002812
0 commit comments