[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