[PATCH] D110482: [clang] Implement if consteval (P1938)

Erich Keane via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Mon Sep 27 12:17:17 PDT 2021


erichkeane added inline comments.


================
Comment at: clang/lib/AST/Stmt.cpp:915
 
-IfStmt::IfStmt(const ASTContext &Ctx, SourceLocation IL, bool IsConstexpr,
-               Stmt *Init, VarDecl *Var, Expr *Cond, SourceLocation LPL,
-               SourceLocation RPL, Stmt *Then, SourceLocation EL, Stmt *Else)
+IfStmt::IfStmt(const ASTContext &Ctx, SourceLocation IL, ConstexprSpecKind ConstexprKind, Stmt *Init, VarDecl *Var, Expr *Cond,
+               SourceLocation LPL, SourceLocation RPL, Stmt *Then,
----------------
Does this need clang-format again?


================
Comment at: clang/lib/AST/Stmt.cpp:927
 
+  assert((!IsConsteval && !IsConstexpr) || IsConsteval != IsConstexpr);
+
----------------
erichkeane wrote:
> Oh dear... I'm not quite sure I want this as a scoped enum.
I see I mistyped here, i'm 'NOW' quite sure.  Thanks for fixing it anyway.


================
Comment at: clang/lib/AST/StmtPrinter.cpp:239
 void StmtPrinter::PrintRawIfStmt(IfStmt *If) {
+  if (If->isConsteval()) {
+    OS << "if consteval";
----------------
I think I'm not a fan of the inversion mostly for this, the fact that we end up printing the reverse of what happens in 'if constexpr' is giving me some heartburn.


================
Comment at: clang/lib/Analysis/CFG.cpp:3050
   BinaryOperator *Cond =
-      I->getConditionVariable()
+      I->isConsteval() || I->getConditionVariable()
           ? nullptr
----------------
I think there is a ternary-confuse-warning in GCC that fires sometimes if you skip outer-parens, you might find it necessary/a good idea to put parens around the condition.


================
Comment at: clang/lib/Analysis/CFG.cpp:3064
     // See if this is a known constant.
-    const TryResult &KnownVal = tryEvaluateBool(I->getCond());
+    TryResult KnownVal;
+    if (!I->isConsteval())
----------------
Note for future-reviewer: This ends up being an improvement here, TryResult contains only a single integer in a VERRY bizarre way, it seems to be intended to essentially be a 'true/false/unknown' bit of hackery (despite having 3 states, its an integer?).  If someone runs across this comment in the future and wants an 'easy win', I suspect swapping it with a `llvm::Optional<bool>` or something would be at least an interface-win.


================
Comment at: clang/lib/Parse/ParseStmt.cpp:1541
+  if (IsConsteval && NotLocation.isValid()) {
+    if (ElseStmt.isUnset())
+      ElseStmt = Actions.ActOnNullStmt(ThenStmtLoc);
----------------
So this is interesting.  I'm not sure how I feel about having the AST not represent the textual representation like this.  I'm interested what others have to say.

My understanding is that this makes:

`if consteval { thenstmt; } else { elsestmt;`
be represented as:
`IfStmt isConsteval, with getThen()== thenstmt`

however
`if not consteval { thenstmt; } else { elsestmt;}`
be represented as:
`IfStmt isConsteval, with getThen()== elsestmt`

IMO, this feels too clever.  

I think I'd prefer that the IfStmt know whether it is a 'not consteval' and select the right one that way.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D110482/new/

https://reviews.llvm.org/D110482



More information about the cfe-commits mailing list