[PATCH] D151587: [clang][ConstantEmitter] have tryEmitPrivate[ForVarInit] try ConstExprEmitter fast-path first
Nick Desaulniers via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Thu Jul 20 10:25:00 PDT 2023
nickdesaulniers added a comment.
In D151587#4516772 <https://reviews.llvm.org/D151587#4516772>, @efriedma wrote:
> 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);
Indeed, but I wonder why only do this when `IsForRef == true` (narrator: it's not)? Also, why for `MaterializeTemporaryExpr` manually force the `ForRef` parameter to `false`?
---
It seems like perhaps we want to call `EvaluateAsLValue` in `Expr::isConstantInitializer` AFTER checking the statement class. Otherwise we're basically reimplementing that big switch statement again; at least two cases as suggested by your diff.
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