diff options
Diffstat (limited to 'lib/Sema/SemaTemplateVariadic.cpp')
| -rw-r--r-- | lib/Sema/SemaTemplateVariadic.cpp | 7 | 
1 files changed, 7 insertions, 0 deletions
| diff --git a/lib/Sema/SemaTemplateVariadic.cpp b/lib/Sema/SemaTemplateVariadic.cpp index 54556b505ee0..725a3e425201 100644 --- a/lib/Sema/SemaTemplateVariadic.cpp +++ b/lib/Sema/SemaTemplateVariadic.cpp @@ -1014,6 +1014,11 @@ ExprResult Sema::ActOnCXXFoldExpr(SourceLocation LParenLoc, Expr *LHS,    CheckFoldOperand(*this, LHS);    CheckFoldOperand(*this, RHS); +  auto DiscardOperands = [&] { +    CorrectDelayedTyposInExpr(LHS); +    CorrectDelayedTyposInExpr(RHS); +  }; +    // [expr.prim.fold]p3:    //   In a binary fold, op1 and op2 shall be the same fold-operator, and    //   either e1 shall contain an unexpanded parameter pack or e2 shall contain @@ -1021,6 +1026,7 @@ ExprResult Sema::ActOnCXXFoldExpr(SourceLocation LParenLoc, Expr *LHS,    if (LHS && RHS &&        LHS->containsUnexpandedParameterPack() ==            RHS->containsUnexpandedParameterPack()) { +    DiscardOperands();      return Diag(EllipsisLoc,                  LHS->containsUnexpandedParameterPack()                      ? diag::err_fold_expression_packs_both_sides @@ -1034,6 +1040,7 @@ ExprResult Sema::ActOnCXXFoldExpr(SourceLocation LParenLoc, Expr *LHS,    if (!LHS || !RHS) {      Expr *Pack = LHS ? LHS : RHS;      assert(Pack && "fold expression with neither LHS nor RHS"); +    DiscardOperands();      if (!Pack->containsUnexpandedParameterPack())        return Diag(EllipsisLoc, diag::err_pack_expansion_without_parameter_packs)               << Pack->getSourceRange(); | 
