view gcc/testsuite/g++.dg/torture/pr70526.C @ 158:494b0b89df80 default tip

...
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Mon, 25 May 2020 18:13:55 +0900
parents 04ced10e8804
children
line wrap: on
line source

// { dg-do run }

typedef unsigned uint32_t;

template<typename T>
struct AlignedStorage2
{
  char mBytes[sizeof(T)];

  const T* addr() const { return reinterpret_cast<const T*>(mBytes); }
  T* addr() { return reinterpret_cast<T*>(mBytes); }
};

struct Register {
    uint32_t reg_;
};

class TypedOrValueRegister
{
  AlignedStorage2<Register> typed;
  __attribute__((noinline)) Register& dataTyped() { return *typed.addr(); }
public:
  TypedOrValueRegister(Register reg)
    {
      dataTyped() = reg;
    }
  Register typedReg() const { return *typed.addr(); }
};

int main() {
    Register reg = { 10u };
    if (TypedOrValueRegister(reg).typedReg().reg_ != 10)
      __builtin_abort();
    return 0;
}