[PATCH] D151587: [clang][ConstantEmitter] have tryEmitPrivate[ForVarInit] try ConstExprEmitter fast-path first

Eli Friedman via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Wed Jul 19 16:58:42 PDT 2023


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



More information about the cfe-commits mailing list