diff --git a/clang/lib/Sema/SemaExprCXX.cpp b/clang/lib/Sema/SemaExprCXX.cpp --- a/clang/lib/Sema/SemaExprCXX.cpp +++ b/clang/lib/Sema/SemaExprCXX.cpp @@ -7219,8 +7219,11 @@ // the member function body. if (!BaseType->isDependentType() && !isThisOutsideMemberFunctionBody(BaseType) && - RequireCompleteType(OpLoc, BaseType, diag::err_incomplete_member_access)) + RequireCompleteType(OpLoc, BaseType, diag::err_incomplete_member_access)) { + if (Base->containsErrors()) + return Base; return ExprError(); + } // C++ [basic.lookup.classref]p2: // If the id-expression in a class member access (5.2.5) is an diff --git a/clang/test/AST/ast-dump-recovery.cpp b/clang/test/AST/ast-dump-recovery.cpp --- a/clang/test/AST/ast-dump-recovery.cpp +++ b/clang/test/AST/ast-dump-recovery.cpp @@ -104,6 +104,16 @@ // CHECK-NEXT:| `-UnresolvedLookupExpr {{.*}} 'invalid' struct alignas(invalid()) Aligned {}; +struct Incomplete; +Incomplete make_incomplete(); +// CHECK: FunctionDecl {{.*}} test2 +// CHECK-NEXT: `-CompoundStmt +// CHECK-NEXT: `-RecoveryExpr {{.*}} contains-errors +// CHECK-NEXT: `-UnresolvedLookupExpr {{.*}} 'make_incomplete' +void test2() { + make_incomplete(); +} + void InvalidInitalizer(int x) { struct Bar { Bar(); }; // CHECK: `-VarDecl {{.*}} a1 'Bar'