Skip to content

Commit da7472e

Browse files
committed
[FOLD]
1 parent 528a97f commit da7472e

File tree

1 file changed

+32
-31
lines changed

1 file changed

+32
-31
lines changed

clang/lib/Sema/SemaExprMember.cpp

Lines changed: 32 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -991,6 +991,9 @@ Sema::BuildMemberReferenceExpr(Expr *BaseExpr, QualType BaseExprType,
991991
bool SuppressQualifierCheck,
992992
ActOnMemberAccessExtraArgs *ExtraArgs) {
993993
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.
994997
if (R.wasNotFoundInCurrentInstantiation() ||
995998
(IsArrow && !BaseExprType->isPointerType() &&
996999
BaseExprType->isDependentType()))
@@ -1038,41 +1041,39 @@ Sema::BuildMemberReferenceExpr(Expr *BaseExpr, QualType BaseExprType,
10381041
<< isa<CXXDestructorDecl>(FD);
10391042

10401043
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);
10661057
}
1058+
if (Trap.hasErrorOccurred())
1059+
RetryExpr = ExprError();
10671060
}
10681061

1062+
// Rederive where we looked up.
1063+
DeclContext *DC =
1064+
(SS.isSet() ? computeDeclContext(SS) : computeDeclContext(BaseType));
10691065
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;
10761077
}
10771078

10781079
// Diagnose lookups that find only declarations from a non-base

0 commit comments

Comments
 (0)