// { 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;
}