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

            Bug ID: 118134
           Summary: std::bit_cast handling of bool anad padding bits is
                    inconsistent at compile time vs runtime
           Product: gcc
           Version: 14.2.0
            Status: UNCONFIRMED
          Keywords: accepts-invalid, wrong-code
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: pinskia at gcc dot gnu.org
  Target Milestone: ---

Take:
```
#include <bit>

constexpr auto c = (char)('A'&~0x1);
constexpr bool A = std::bit_cast<bool>(c);
static_assert(!A);
bool t = A;
int main()
{
  char c1 = c;
  bool t1 = std::bit_cast<bool>(c1);
  __builtin_printf("%s\n", A ? "true" : "false");
  __builtin_printf("%s\n", t ? "true" : "false");
  __builtin_printf("%s\n", t1 ? "true" : "false");
}
```

GCC accepts the above even though the bool representation is only 0x01/0x00 are
valid as far as I know. So at constexpr time, GCC thinks bool has padding bits.

While runtime we get a different answer, true.

Reply via email to