@@ -724,6 +724,7 @@ static Type diagnoseUnknownType(TypeChecker &tc, DeclContext *dc,
724
724
SourceRange parentRange,
725
725
ComponentIdentTypeRepr *comp,
726
726
TypeResolutionOptions options,
727
+ NameLookupOptions lookupOptions,
727
728
GenericTypeResolver *resolver,
728
729
UnsatisfiedDependency *unsatisfiedDependency) {
729
730
// Unqualified lookup case.
@@ -785,6 +786,30 @@ static Type diagnoseUnknownType(TypeChecker &tc, DeclContext *dc,
785
786
}
786
787
787
788
// Qualified lookup case.
789
+
790
+ // Try ignoring access control.
791
+ NameLookupOptions relookupOptions = lookupOptions;
792
+ relookupOptions |= NameLookupFlags::KnownPrivate;
793
+ relookupOptions |= NameLookupFlags::IgnoreAccessibility;
794
+ auto inaccessibleMembers = tc.lookupMemberType (dc, parentType,
795
+ comp->getIdentifier (),
796
+ relookupOptions);
797
+ if (inaccessibleMembers) {
798
+ // FIXME: What if the unviable candidates have different levels of access?
799
+ const TypeDecl *first = inaccessibleMembers.front ().first ;
800
+ tc.diagnose (comp->getIdLoc (), diag::candidate_inaccessible,
801
+ comp->getIdentifier (), first->getFormalAccess ());
802
+
803
+ // FIXME: If any of the candidates (usually just one) are in the same module
804
+ // we could offer a fix-it.
805
+ for (auto lookupResult : inaccessibleMembers)
806
+ tc.diagnose (lookupResult.first , diag::type_declared_here);
807
+
808
+ // Don't try to recover here; we'll get more access-related diagnostics
809
+ // downstream if we do.
810
+ return ErrorType::get (tc.Context );
811
+ }
812
+
788
813
// FIXME: Typo correction!
789
814
790
815
// Lookup into a type.
@@ -986,7 +1011,7 @@ resolveTopLevelIdentTypeComponent(TypeChecker &TC, DeclContext *DC,
986
1011
return ErrorType::get (TC.Context );
987
1012
988
1013
return diagnoseUnknownType (TC, DC, nullptr , SourceRange (), comp, options,
989
- resolver, unsatisfiedDependency);
1014
+ lookupOptions, resolver, unsatisfiedDependency);
990
1015
}
991
1016
992
1017
comp->setValue (currentDecl);
@@ -1150,7 +1175,8 @@ static Type resolveNestedIdentTypeComponent(
1150
1175
}
1151
1176
1152
1177
Type ty = diagnoseUnknownType (TC, DC, parentTy, parentRange, comp, options,
1153
- resolver, unsatisfiedDependency);
1178
+ lookupOptions, resolver,
1179
+ unsatisfiedDependency);
1154
1180
if (!ty || ty->is <ErrorType>()) {
1155
1181
return ErrorType::get (TC.Context );
1156
1182
}
0 commit comments