diff --git a/clang/include/clang/AST/Expr.h b/clang/include/clang/AST/Expr.h index fab84f6a6ecd38..4d89234b0da7c1 100644 --- a/clang/include/clang/AST/Expr.h +++ b/clang/include/clang/AST/Expr.h @@ -6080,7 +6080,8 @@ class RecoveryExpr final : public Expr, private: RecoveryExpr(ASTContext &Ctx, SourceLocation BeginLoc, SourceLocation EndLoc, ArrayRef SubExprs); - RecoveryExpr(EmptyShell Empty) : Expr(RecoveryExprClass, Empty) {} + RecoveryExpr(EmptyShell Empty, unsigned NumSubExprs) + : Expr(RecoveryExprClass, Empty), NumExprs(NumSubExprs) {} size_t numTrailingObjects(OverloadToken) const { return NumExprs; } diff --git a/clang/lib/AST/Expr.cpp b/clang/lib/AST/Expr.cpp index bc6fadc71609b1..f108b49ceac1ba 100644 --- a/clang/lib/AST/Expr.cpp +++ b/clang/lib/AST/Expr.cpp @@ -4652,7 +4652,7 @@ RecoveryExpr *RecoveryExpr::Create(ASTContext &Ctx, SourceLocation BeginLoc, RecoveryExpr *RecoveryExpr::CreateEmpty(ASTContext &Ctx, unsigned NumSubExprs) { void *Mem = Ctx.Allocate(totalSizeToAlloc(NumSubExprs), alignof(RecoveryExpr)); - return new (Mem) RecoveryExpr(EmptyShell()); + return new (Mem) RecoveryExpr(EmptyShell(), NumSubExprs); } void OMPArrayShapingExpr::setDimensions(ArrayRef Dims) { diff --git a/clang/test/PCH/cxx-recovery-expr.cpp b/clang/test/PCH/cxx-recovery-expr.cpp new file mode 100644 index 00000000000000..e0d58c119c5404 --- /dev/null +++ b/clang/test/PCH/cxx-recovery-expr.cpp @@ -0,0 +1,13 @@ +// Test with pch. +// RUN: %clang_cc1 -emit-pch -frecovery-ast -fallow-pch-with-compiler-errors -o %t %s +// RUN: %clang_cc1 -include-pch %t -fno-validate-pch -emit-llvm -o - %s + +#ifndef HEADER +#define HEADER + +int func(int); +int s = func(); + +#else + +#endif