================
@@ -4368,8 +4363,19 @@ template <class Emitter> bool 
Compiler<Emitter>::visitIfStmt(const IfStmt *IS) {
     if (!visitDeclStmt(CondDecl))
       return false;
 
-  if (!this->visitBool(IS->getCond()))
-    return false;
+  // Compile condition.
+  if (IS->isNonNegatedConsteval()) {
+    if (!this->emitIsConstantContext(IS))
+      return false;
+  } else if (IS->isNegatedConsteval()) {
+    if (!this->emitIsConstantContext(IS))
+      return false;
+    if (!this->emitInv(IS))
+      return false;
+  } else {
+    if (!this->visitBool(IS->getCond()))
+      return false;
+  }
----------------
tbaederr wrote:

Stuff like that _needs_ to be "implemented" in the interpreter. It must be, 
because it must be rejected as well. It's the same example as the `goto` 
statement above. It needs to be compiled to bytecode, somehow. If it isn't then 
using it in a constexpr function (without the `if consteval` will also fail).

Again, this is no different than any other if statement. I could imagine 
compiling two different versions of functions (one for consteval = true, one 
for =false), but we have the same problem with other if statements. This is 
just a difference between the interpreting and compiling approach.

https://github.com/llvm/llvm-project/pull/104707
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to