Consider:
void f();
constexpr auto p1 = (void*)f;
constexpr auto p2 = (void(*)())p1;
clang currently accepts, but these should be rejected. [expr.const] says an expression is not a constant expression if it contains a reinterpret_cast ... and converting a function pointer to an object pointer requires a reinterpret_cast.
gcc rejects, MSVC accepts p1.