@@ -991,7 +991,12 @@ 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 (R.wasNotFoundInCurrentInstantiation ())
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.
997
+ if (R.wasNotFoundInCurrentInstantiation () ||
998
+ (IsArrow && !BaseExprType->isPointerType () &&
999
+ BaseExprType->isDependentType ()))
995
1000
return ActOnDependentMemberExpr (BaseExpr, BaseExprType, IsArrow, OpLoc, SS,
996
1001
TemplateKWLoc, FirstQualifierInScope,
997
1002
R.getLookupNameInfo (), TemplateArgs);
@@ -1036,41 +1041,39 @@ Sema::BuildMemberReferenceExpr(Expr *BaseExpr, QualType BaseExprType,
1036
1041
<< isa<CXXDestructorDecl>(FD);
1037
1042
1038
1043
if (R.empty ()) {
1039
- // Rederive where we looked up.
1040
- DeclContext *DC =
1041
- (SS.isSet () ? computeDeclContext (SS) : computeDeclContext (BaseType));
1042
- if (ExtraArgs) {
1043
- ExprResult RetryExpr;
1044
- if (!IsArrow && BaseExpr && !BaseExpr->isTypeDependent ()) {
1045
- SFINAETrap Trap (*this , true );
1046
- ParsedType ObjectType;
1047
- bool MayBePseudoDestructor = false ;
1048
- RetryExpr = ActOnStartCXXMemberReference (getCurScope (), BaseExpr,
1049
- OpLoc, tok::arrow, ObjectType,
1050
- MayBePseudoDestructor);
1051
- if (RetryExpr.isUsable () && !Trap.hasErrorOccurred ()) {
1052
- CXXScopeSpec TempSS (SS);
1053
- RetryExpr = ActOnMemberAccessExpr (
1054
- ExtraArgs->S , RetryExpr.get (), OpLoc, tok::arrow, TempSS,
1055
- TemplateKWLoc, ExtraArgs->Id , ExtraArgs->ObjCImpDecl );
1056
- }
1057
- if (Trap.hasErrorOccurred ())
1058
- RetryExpr = ExprError ();
1059
- }
1060
- if (RetryExpr.isUsable ()) {
1061
- Diag (OpLoc, diag::err_no_member_overloaded_arrow)
1062
- << MemberName << DC << FixItHint::CreateReplacement (OpLoc, " ->" );
1063
- 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 );
1064
1057
}
1058
+ if (Trap.hasErrorOccurred ())
1059
+ RetryExpr = ExprError ();
1065
1060
}
1066
1061
1062
+ // Rederive where we looked up.
1063
+ DeclContext *DC =
1064
+ (SS.isSet () ? computeDeclContext (SS) : computeDeclContext (BaseType));
1067
1065
assert (DC);
1068
- Diag (R.getNameLoc (), diag::err_no_member)
1069
- << MemberName << DC
1070
- << (SS.isSet ()
1071
- ? SS.getRange ()
1072
- : (BaseExpr ? BaseExpr->getSourceRange () : SourceRange ()));
1073
- 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;
1074
1077
}
1075
1078
1076
1079
// Diagnose lookups that find only declarations from a non-base
0 commit comments