https://gcc.gnu.org/bugzilla/show_bug.cgi?id=102401
Bug ID: 102401
Summary: std::bit_cast falls over, seemingly due to some
invisible alignment requirements
Product: gcc
Version: 12.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c++
Assignee: unassigned at gcc dot gnu.org
Reporter: krax.powah at gmail dot com
Target Milestone: ---
GCC Version: The current truck (12.0.0 20210917), but also present on all
versions which support std::bit_cast.
Repro case (https://godbolt.org/z/zWbMnMfvx):
```
#include <bit>
struct Item
{
float a = 0;
float b = 0;
char c = 0; // Removing this or changing it to type with a size of 4
}; // fixes it.
struct M
{
struct Data { char d[sizeof(Item)]; };
static constexpr Data build(Item item)
{
Data d {};
d = std::bit_cast<Data>(item);
return d;
}
};
int main(void)
{
constexpr auto data = M::build({}); // Only occurs if this is a
constexpr assignment
}
```
Result:
```
In file included from <source>:1:
/opt/compiler-explorer/gcc-trunk-20210917/include/c++/12.0.0/bit: In
function 'int main()':
<source>:26:35: in 'constexpr' expansion of 'M::build(Item{(float)0,
(float)0, '\000'})'
<source>:18:32: in 'constexpr' expansion of 'std::bit_cast<M::Data,
Item>(item)'
/opt/compiler-explorer/gcc-trunk-20210917/include/c++/12.0.0/bit:77:33:
error: '__builtin_bit_cast' accessing uninitialized byte at offset 9
77 | return __builtin_bit_cast(_To, __from);
| ^~~
ASM generation compiler returned: 1
In file included from <source>:1:
/opt/compiler-explorer/gcc-trunk-20210917/include/c++/12.0.0/bit: In
function 'int main()':
<source>:26:35: in 'constexpr' expansion of 'M::build(Item{(float)0,
(float)0, '\000'})'
<source>:18:32: in 'constexpr' expansion of 'std::bit_cast<M::Data,
Item>(item)'
/opt/compiler-explorer/gcc-trunk-20210917/include/c++/12.0.0/bit:77:33:
error: '__builtin_bit_cast' accessing uninitialized byte at offset 9
77 | return __builtin_bit_cast(_To, __from);
| ^~~
Execution build compiler returned: 1
```