Issue 58078
Summary `__builtin_constant_p` fails/behaves differently from GCC
Labels new issue
Assignees
Reporter h-2
    ```cpp
#include <type_traits>

#define IS_CONSTEXPR(...) std::integral_constant<bool, __builtin_constant_p((__VA_ARGS__, 0))>::value

struct S
{
    int i = 0;

    constexpr S & assign_int(int j)
    {
        i = j;
        return *this;
    }
};

inline constexpr auto s = S{}.assign_int(3);    // works
static_assert(IS_CONSTEXPR(S{}.assign_int(3))); // fails in clang, passes in GCC
```

The macro `IS_CONSTEXPR` can check whether a wide variety of expressions are well-formed in a const context.  I know that `__builtin_constant_p` is non-standard, but based on the documentation, I assume that clang's implementation is supposed to behave like GCC's. In this case, it does not.

I don't know whether this is just a deficiency of the builtin, or whether this also means clang is less likely to evaluate such expressions at compile time (when not required).
_______________________________________________
llvm-bugs mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-bugs

Reply via email to