================ @@ -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; + } ---------------- cor3ntin wrote:
the whole point of `if consteval` is to allow a runtime evaluation to do thing that would not be valid in constant context, such as asm or simd or reinterpret cast or crazy vendor extensions. so ```cpp constexpr void f() { if !consteval { // copy a volatile vla with simd and execute a gpu kernel } } ``` is intended to always work. I don't think it would be reasonable to delay adoption of the new interpreter until we support _all_ the features of clang in the bytecode. So this approach is probably not viable. If you really want to create bytecode for both branches, you need to have an escape hatch so that if the non-consteval branch cannot produce bytecode, we still can support the consteval branch without error 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