@@ -991,6 +991,9 @@ Sema::BuildMemberReferenceExpr(Expr *BaseExpr, QualType BaseExprType,
991
991
bool SuppressQualifierCheck,
992
992
ActOnMemberAccessExtraArgs *ExtraArgs) {
993
993
assert (!SS.isInvalid () && " nested-name-specifier cannot be invalid" );
994
+ // If the member wasn't found in the current instantiation, or if the
995
+ // arrow operator was used with a dependent non-pointer object expression,
996
+ // build a CXXDependentScopeMemberExpr.
994
997
if (R.wasNotFoundInCurrentInstantiation () ||
995
998
(IsArrow && !BaseExprType->isPointerType () &&
996
999
BaseExprType->isDependentType ()))
@@ -1038,41 +1041,39 @@ Sema::BuildMemberReferenceExpr(Expr *BaseExpr, QualType BaseExprType,
1038
1041
<< isa<CXXDestructorDecl>(FD);
1039
1042
1040
1043
if (R.empty ()) {
1041
- // Rederive where we looked up.
1042
- DeclContext *DC =
1043
- (SS.isSet () ? computeDeclContext (SS) : computeDeclContext (BaseType));
1044
- if (ExtraArgs) {
1045
- ExprResult RetryExpr;
1046
- if (!IsArrow && BaseExpr && !BaseExpr->isTypeDependent ()) {
1047
- SFINAETrap Trap (*this , true );
1048
- ParsedType ObjectType;
1049
- bool MayBePseudoDestructor = false ;
1050
- RetryExpr = ActOnStartCXXMemberReference (getCurScope (), BaseExpr,
1051
- OpLoc, tok::arrow, ObjectType,
1052
- MayBePseudoDestructor);
1053
- if (RetryExpr.isUsable () && !Trap.hasErrorOccurred ()) {
1054
- CXXScopeSpec TempSS (SS);
1055
- RetryExpr = ActOnMemberAccessExpr (
1056
- ExtraArgs->S , RetryExpr.get (), OpLoc, tok::arrow, TempSS,
1057
- TemplateKWLoc, ExtraArgs->Id , ExtraArgs->ObjCImpDecl );
1058
- }
1059
- if (Trap.hasErrorOccurred ())
1060
- RetryExpr = ExprError ();
1061
- }
1062
- if (RetryExpr.isUsable ()) {
1063
- Diag (OpLoc, diag::err_no_member_overloaded_arrow)
1064
- << MemberName << DC << FixItHint::CreateReplacement (OpLoc, " ->" );
1065
- return RetryExpr;
1044
+ ExprResult RetryExpr = ExprError ();
1045
+ if (ExtraArgs && !IsArrow && BaseExpr && !BaseExpr->isTypeDependent ()) {
1046
+ SFINAETrap Trap (*this , true );
1047
+ ParsedType ObjectType;
1048
+ bool MayBePseudoDestructor = false ;
1049
+ RetryExpr = ActOnStartCXXMemberReference (getCurScope (), BaseExpr, OpLoc,
1050
+ tok::arrow, ObjectType,
1051
+ MayBePseudoDestructor);
1052
+ if (RetryExpr.isUsable () && !Trap.hasErrorOccurred ()) {
1053
+ CXXScopeSpec TempSS (SS);
1054
+ RetryExpr = ActOnMemberAccessExpr (
1055
+ ExtraArgs->S , RetryExpr.get (), OpLoc, tok::arrow, TempSS,
1056
+ TemplateKWLoc, ExtraArgs->Id , ExtraArgs->ObjCImpDecl );
1066
1057
}
1058
+ if (Trap.hasErrorOccurred ())
1059
+ RetryExpr = ExprError ();
1067
1060
}
1068
1061
1062
+ // Rederive where we looked up.
1063
+ DeclContext *DC =
1064
+ (SS.isSet () ? computeDeclContext (SS) : computeDeclContext (BaseType));
1069
1065
assert (DC);
1070
- Diag (R.getNameLoc (), diag::err_no_member)
1071
- << MemberName << DC
1072
- << (SS.isSet ()
1073
- ? SS.getRange ()
1074
- : (BaseExpr ? BaseExpr->getSourceRange () : SourceRange ()));
1075
- return ExprError ();
1066
+
1067
+ if (RetryExpr.isUsable ())
1068
+ Diag (OpLoc, diag::err_no_member_overloaded_arrow)
1069
+ << MemberName << DC << FixItHint::CreateReplacement (OpLoc, " ->" );
1070
+ else
1071
+ Diag (R.getNameLoc (), diag::err_no_member)
1072
+ << MemberName << DC
1073
+ << (SS.isSet ()
1074
+ ? SS.getRange ()
1075
+ : (BaseExpr ? BaseExpr->getSourceRange () : SourceRange ()));
1076
+ return RetryExpr;
1076
1077
}
1077
1078
1078
1079
// Diagnose lookups that find only declarations from a non-base
0 commit comments