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

            Bug ID: 111436
           Summary: Wrong code when bit-casting struct through pointer
           Product: gcc
           Version: 12.3.1
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: josopait at goopax dot com
  Target Milestone: ---

Does gcc produce wrong code here? The program below is part of a bitwise
conversion mechanism, similar to std::bit_cast, but for more general types.

The output should be:
from=17,23
to=17,23

But with -O2 or higher the output is:
from=17,23
to=0,0

I tried with gcc 12, 13, and 14 on x86_64 linux.






#include <iostream>
#include <cstdint>
#include <array>
using namespace std;


template<typename TO, typename FROM>
inline void reinterpret_switch3(TO& to, const FROM& from)
{
  to = *reinterpret_cast<const TO*>(&from);
}

template<typename TO, typename FROM>
inline void reinterpret_switch2(TO& to, const FROM& from)
{
  reinterpret_switch3(to, array<FROM, 1>({ { from } }));
}

template<typename TO, typename FROM>
inline void reinterpret_switch(TO& to, const FROM& from)
{
  array<TO, 1> tmp;
  reinterpret_switch2(tmp, from);
  to = tmp[0];
}


int main(int argc, char** argv)
{
  pair<uint32_t, uint32_t> from = {17, 23};
  pair<int32_t, int32_t> to;
  reinterpret_switch(to, from);

  cout << "from=" << from.first << "," << from.second << endl;
  cout << "to=" << to.first << "," << to.second << endl;
}

Reply via email to