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

Reply via email to