@@ -2698,7 +2698,7 @@ diagnoseUnviableLookupResults(MemberLookupResult &result, Type baseObjTy,
2698
2698
instanceTy, memberName)
2699
2699
.highlight (baseRange).highlight (nameLoc.getSourceRange ());
2700
2700
return ;
2701
- case MemberLookupResult::UR_InstanceMemberOnType:
2701
+ case MemberLookupResult::UR_InstanceMemberOnType: {
2702
2702
// If the base is an implicit self type reference, and we're in a
2703
2703
// an initializer, then the user wrote something like:
2704
2704
//
@@ -2744,11 +2744,28 @@ diagnoseUnviableLookupResults(MemberLookupResult &result, Type baseObjTy,
2744
2744
return ;
2745
2745
}
2746
2746
}
2747
-
2748
- diagnose (loc, diag::could_not_use_instance_member_on_type,
2749
- instanceTy, memberName)
2750
- .highlight (baseRange).highlight (nameLoc.getSourceRange ());
2747
+
2748
+ // Check whether the instance member is declared on parent context and if so
2749
+ // provide more specialized message.
2750
+ auto memberTypeContext = member->getDeclContext ()->getInnermostTypeContext ();
2751
+ auto currentTypeContext = CS.DC ->getInnermostTypeContext ();
2752
+ if (memberTypeContext && currentTypeContext &&
2753
+ memberTypeContext->getSemanticDepth () <
2754
+ currentTypeContext->getSemanticDepth ()) {
2755
+ diagnose (loc, diag::could_not_use_instance_member_on_type,
2756
+ currentTypeContext->getDeclaredInterfaceType (), memberName,
2757
+ memberTypeContext->getDeclaredTypeOfContext (),
2758
+ true )
2759
+ .highlight (baseRange).highlight (nameLoc.getSourceRange ());
2760
+ } else {
2761
+ diagnose (loc, diag::could_not_use_instance_member_on_type,
2762
+ instanceTy, memberName,
2763
+ instanceTy,
2764
+ false )
2765
+ .highlight (baseRange).highlight (nameLoc.getSourceRange ());
2766
+ }
2751
2767
return ;
2768
+ }
2752
2769
2753
2770
case MemberLookupResult::UR_TypeMemberOnInstance:
2754
2771
diagnoseTypeMemberOnInstanceLookup (baseObjTy, baseExpr,
@@ -5027,12 +5044,15 @@ diagnoseInstanceMethodAsCurriedMemberOnType(CalleeCandidateInfo &CCI,
5027
5044
}
5028
5045
5029
5046
// Otherwise, complain about use of instance value on type.
5030
- auto diagnostic = isa<TypeExpr>(baseExpr)
5031
- ? diag::instance_member_use_on_type
5032
- : diag::could_not_use_instance_member_on_type;
5033
-
5034
- TC.diagnose (UDE->getLoc (), diagnostic, instanceType, UDE->getName ())
5047
+ if (isa<TypeExpr>(baseExpr)) {
5048
+ TC.diagnose (UDE->getLoc (), diag::instance_member_use_on_type,
5049
+ instanceType, UDE->getName ())
5035
5050
.highlight (baseExpr->getSourceRange ());
5051
+ } else {
5052
+ TC.diagnose (UDE->getLoc (), diag::could_not_use_instance_member_on_type,
5053
+ instanceType, UDE->getName (), instanceType, false )
5054
+ .highlight (baseExpr->getSourceRange ());
5055
+ }
5036
5056
return true ;
5037
5057
}
5038
5058
}
0 commit comments