https://gcc.gnu.org/bugzilla/show_bug.cgi?id=107104

Hannes Hauswedell <h2+bugs at fsfe dot org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |h2+bugs at fsfe dot org

--- Comment #1 from Hannes Hauswedell <h2+bugs at fsfe dot org> ---
It seems that __builtin_constant_p does not indicate whether something *can be*
a constant but whether *it is* a constant.
If you evaluate it in a non-const-context, the expression passed as argument
may or may not be evaluated at compile-time, so the value of
__builtin_constant_p may or may not be 1.

This example illustrates the behaviour:

```cpp
constexpr void foobar() {}    // → test() returns 0 or 1
//consteval void foobar() {}  // → test() returns 1

#define TEST_EXPR (foobar(), 0)

int test() {
    static_assert(__builtin_constant_p(TEST_EXPR));
    return __builtin_constant_p(TEST_EXPR);
}
```


To enforce evaluation in a const-context, you can define a macro like this:

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

Reply via email to