Izaron added a comment. After an investigation in GDB I can say that the assert seems to be wrong. Since Clang instantiates classes and functions "on the fly" where appropriate, we indeed can get a run-time evaluation context after a compile-time evaluation context. I was sure that evaluation contexts were made to represent a clean hierarchy of context, because they're interrelated, but the case with instantiations confuses me.
This code ... template<int N> struct good_struct { // we are in run-time eval context! static consteval int evalconst() { // we are in compile-time eval context! return N * N; } void foo(); void bar(); }; //int good_struct_100 = good_struct<100>::evalconst(); //int good_struct_200 = good_struct<200>::evalconst(); consteval int consteval_foo() { // we are in compile-time eval context! return good_struct<100>::evalconst(); } template</* we are in compile-time eval context! */ int N = good_struct<200>::evalconst()> constexpr int templated_foo() { return N; } ... hits the assert two times, unless we uncomment the lines with `good_struct_100` and `good_struct_200`. That's because Clang instantiates the classes when it "sees" them, straight from consteval/template contexts. I couldn't come up with a correct code that breaks though. I am now less sure if the patch (without the assert) is acceptable, what if the concept of "evaluation contexts" needs a revision?.. Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D119651/new/ https://reviews.llvm.org/D119651 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits