efriedma added a comment. This seems to work:
diff --git a/clang/lib/AST/Expr.cpp b/clang/lib/AST/Expr.cpp index 25d3535e..98b1e4d 100644 --- a/clang/lib/AST/Expr.cpp +++ b/clang/lib/AST/Expr.cpp @@ -3319,6 +3319,10 @@ bool Expr::isConstantInitializer(ASTContext &Ctx, bool IsForRef, // kill the second parameter. if (IsForRef) { + if (auto *EWC = dyn_cast<ExprWithCleanups>(this)) + return EWC->getSubExpr()->isConstantInitializer(Ctx, true, Culprit); + if (auto *MTE = dyn_cast<MaterializeTemporaryExpr>(this)) + return MTE->getSubExpr()->isConstantInitializer(Ctx, false, Culprit); EvalResult Result; if (EvaluateAsLValue(Result, Ctx) && !Result.HasSideEffects) return true; diff --git a/clang/lib/AST/ExprConstant.cpp b/clang/lib/AST/ExprConstant.cpp index f0185d0..69b0d0d 100644 --- a/clang/lib/AST/ExprConstant.cpp +++ b/clang/lib/AST/ExprConstant.cpp @@ -8381,6 +8381,9 @@ bool LValueExprEvaluator::VisitCallExpr(const CallExpr *E) { bool LValueExprEvaluator::VisitMaterializeTemporaryExpr( const MaterializeTemporaryExpr *E) { + if (Info.EvalMode == EvalInfo::EM_ConstantFold) + return false; + // Walk through the expression to find the materialized temporary itself. SmallVector<const Expr *, 2> CommaLHSs; SmallVector<SubobjectAdjustment, 2> Adjustments; @@ -8388,8 +8391,8 @@ bool LValueExprEvaluator::VisitMaterializeTemporaryExpr( E->getSubExpr()->skipRValueSubobjectAdjustments(CommaLHSs, Adjustments); // If we passed any comma operators, evaluate their LHSs. - for (unsigned I = 0, N = CommaLHSs.size(); I != N; ++I) - if (!EvaluateIgnoredValue(Info, CommaLHSs[I])) + for (const Expr *E : CommaLHSs) + if (!EvaluateIgnoredValue(Info, E)) return false; // A materialized temporary with static storage duration can appear within the @@ -15472,7 +15475,7 @@ bool Expr::EvaluateAsInitializer(APValue &Value, const ASTContext &Ctx, EStatus.Diag = &Notes; EvalInfo Info(Ctx, EStatus, - (IsConstantInitialization && Ctx.getLangOpts().CPlusPlus11) + (IsConstantInitialization && Ctx.getLangOpts().CPlusPlus) ? EvalInfo::EM_ConstantExpression : EvalInfo::EM_ConstantFold); Info.setEvaluatingDecl(VD, Value); Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D151587/new/ https://reviews.llvm.org/D151587 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits