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

Matthijs Kooijman <matthijs at stdin dot nl> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |matthijs at stdin dot nl

--- Comment #5 from Matthijs Kooijman <matthijs at stdin dot nl> ---
I also ran into this problem in an embedded project and the workaround also
works for me - thanks!

I had already made a short testcase in godbolt for this before I found this
report. I'll share it here just in case it is useful for testing this problem
later: https://godbolt.org/z/s1eK6a3Pf

Here's the code:

#include <stdio.h>
// I added always_inline to see if that would help - seems to make not
difference
//[[gnu::always_inline]] static inline bool always_true() 
__attribute__((always_inline));
static inline bool always_true() { return true; }

static constexpr inline bool constexpr_always_true() { return true; }

int main() {
    printf("DIRECT: %d\n", __builtin_constant_p(always_true()));
    bool var = always_true();
    printf("VIAVAR: %d\n", __builtin_constant_p(var));
    printf("CONSTEXPR: %d\n", __builtin_constant_p(constexpr_always_true()));
}

Gcc 12.2 outputs:

DIRECT: 0
VIAVAR: 1
CONSTEXPR: 1

Two additional observations:
 - clang seems to behave the same as gcc here
 - Adding constexpr to the function definition also fixes the problem without
the workaround (but might not always be useful - constexpr has more strict
requirements than a __builtin_constant_p test).
 - Adding always_inline attributes makes no difference.

Reply via email to