[PATCH] D111400: [Clang] Implement P2242R3

Hubert Tong via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Fri Oct 8 12:22:27 PDT 2021


hubert.reinterpretcast added a comment.

I am concerned that the general direction of this patch (to allow the previously ill-formed constexpr functions as an extension under older language levels) is based upon bugs/divergences-from-orthodoxy in Clang's implementation of C++20 (noting that the committee discussion did not agree with Clang's split between the template and non-template cases).

Evaluating "an invocation of an instantiated constexpr function that fails to satisfy the requirements for a constexpr function" causes an expression to not be a core constant expression. The ability to SFINAE on this can be demonstrated using GCC.

For the following case under C++20, GCC finds that the template candidate suffers from substitution failure (Clang doesn't):
https://godbolt.org/z/h71ffYafM

  struct NonLiteral {
    NonLiteral();
    operator int();
  } *pNL = 0;
  
  template <typename T, T> struct ValueSink;
  
  template <typename T>
  struct A {
    constexpr int f() {
      return 42;
      T t;
    }
  };
  
  short *f(void *);
  
  template <typename T>
  long *f(T *, ValueSink<int, A<T>().f()> * = 0);
  
  using retty = decltype(f(pNL));
  typedef short *retty;


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D111400/new/

https://reviews.llvm.org/D111400



More information about the cfe-commits mailing list