[PATCH] D119651: [clang] Fix evaluation context type for consteval function calls in instantiations
Utkarsh Saxena via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Thu Aug 18 02:24:12 PDT 2022
usaxena95 added a comment.
Herald added a project: All.
Hi, I have been trying to get consteval in a better shape.
In D119651#3327212 <https://reviews.llvm.org/D119651#3327212>, @Izaron wrote:
> 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.
Can you rebase and verify if there are still assertion failures. I think the assertion is fair. Dependent immediate function invocations must be done during instantiation. I suspect https://reviews.llvm.org/D132031 might have fixed the issue.
> 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?..
Can you also give a reproducer for which you see the assertion failure if you still see this.
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D119651/new/
https://reviews.llvm.org/D119651
More information about the cfe-commits
mailing list