@@ -995,8 +995,6 @@ Sema::BuildMemberReferenceExpr(Expr *BaseExpr, QualType BaseExprType,
995
995
// arrow operator was used with a dependent non-pointer object expression,
996
996
// build a CXXDependentScopeMemberExpr.
997
997
if (R.wasNotFoundInCurrentInstantiation () ||
998
- (IsArrow && !BaseExprType->isPointerType () &&
999
- BaseExprType->isDependentType ()) ||
1000
998
(R.getLookupName ().getCXXOverloadedOperator () == OO_Equal &&
1001
999
(SS.isSet () ? SS.getScopeRep ()->isDependent ()
1002
1000
: BaseExprType->isDependentType ())))
@@ -1322,7 +1320,11 @@ static ExprResult LookupMemberExpr(Sema &S, LookupResult &R,
1322
1320
else if (const ObjCObjectPointerType *Ptr =
1323
1321
BaseType->getAs <ObjCObjectPointerType>())
1324
1322
BaseType = Ptr->getPointeeType ();
1325
- else if (!BaseType->isDependentType ()) {
1323
+ else if (BaseType->isFunctionType ())
1324
+ goto fail;
1325
+ else if (BaseType->isDependentType ())
1326
+ BaseType = S.Context .DependentTy ;
1327
+ else {
1326
1328
if (BaseType->isRecordType ()) {
1327
1329
// Recover from arrow accesses to records, e.g.:
1328
1330
// struct MyRecord foo;
@@ -1337,8 +1339,6 @@ static ExprResult LookupMemberExpr(Sema &S, LookupResult &R,
1337
1339
<< FixItHint::CreateReplacement (OpLoc, " ." );
1338
1340
}
1339
1341
IsArrow = false ;
1340
- } else if (BaseType->isFunctionType ()) {
1341
- goto fail;
1342
1342
} else {
1343
1343
S.Diag (MemberLoc, diag::err_typecheck_member_reference_arrow)
1344
1344
<< BaseType << BaseExpr.get ()->getSourceRange ();
0 commit comments