@@ -815,6 +815,9 @@ ExprResult Sema::BuildMemberReferenceExpr(
815
815
ActOnMemberAccessExtraArgs *ExtraArgs) {
816
816
LookupResult R (*this , NameInfo, LookupMemberName);
817
817
818
+ if (SS.isInvalid ())
819
+ SS.clear ();
820
+
818
821
// Implicit member accesses.
819
822
if (!Base) {
820
823
TypoExpr *TE = nullptr ;
@@ -1014,7 +1017,7 @@ Sema::BuildMemberReferenceExpr(Expr *BaseExpr, QualType BaseExprType,
1014
1017
const Scope *S,
1015
1018
bool SuppressQualifierCheck,
1016
1019
ActOnMemberAccessExtraArgs *ExtraArgs) {
1017
-
1020
+ assert (!SS. isInvalid () && " nested-name-specifier cannot be invalid " );
1018
1021
if (R.wasNotFoundInCurrentInstantiation () ||
1019
1022
(SS.isValid () && !computeDeclContext (SS, false ))) {
1020
1023
return ActOnDependentMemberExpr (BaseExpr, BaseExprType, IsArrow, OpLoc, SS,
@@ -1059,7 +1062,8 @@ Sema::BuildMemberReferenceExpr(Expr *BaseExpr, QualType BaseExprType,
1059
1062
if (R.empty ()) {
1060
1063
// Rederive where we looked up.
1061
1064
DeclContext *DC = (SS.isSet () ? computeDeclContext (SS, false )
1062
- : BaseType->getAsRecordDecl ());
1065
+ : computeDeclContext (BaseType));
1066
+ // : BaseType->getAsRecordDecl());
1063
1067
1064
1068
if (ExtraArgs) {
1065
1069
ExprResult RetryExpr;
@@ -1086,7 +1090,10 @@ Sema::BuildMemberReferenceExpr(Expr *BaseExpr, QualType BaseExprType,
1086
1090
}
1087
1091
}
1088
1092
1089
- if (DC) {
1093
+ if (SS.isInvalid () || (SS.isNotEmpty () && !DC)) {
1094
+ Diag (R.getNameLoc (), diag::err_undeclared_use)
1095
+ << MemberName << SS.getRange ();
1096
+ } else if (DC) {
1090
1097
Diag (R.getNameLoc (), diag::err_no_member)
1091
1098
<< MemberName << DC
1092
1099
<< (BaseExpr ? BaseExpr->getSourceRange () : SourceRange ());
@@ -1096,6 +1103,16 @@ Sema::BuildMemberReferenceExpr(Expr *BaseExpr, QualType BaseExprType,
1096
1103
<< MemberName << BaseExprType
1097
1104
<< (BaseExpr ? BaseExpr->getSourceRange () : SourceRange ());
1098
1105
}
1106
+
1107
+ if (DC) {
1108
+ } else {
1109
+ #if 0
1110
+ // FIXME: Is this needed?
1111
+ Diag(R.getNameLoc(), diag::err_no_member)
1112
+ << MemberName << BaseExprType
1113
+ << (BaseExpr ? BaseExpr->getSourceRange() : SourceRange());
1114
+ #endif
1115
+ }
1099
1116
return ExprError ();
1100
1117
}
1101
1118
0 commit comments