1// { dg-do run } 2 3typedef unsigned uint32_t; 4 5template<typename T> 6struct AlignedStorage2 7{ 8 char mBytes[sizeof(T)]; 9 10 const T* addr() const { return reinterpret_cast<const T*>(mBytes); } 11 T* addr() { return reinterpret_cast<T*>(mBytes); } 12}; 13 14struct Register { 15 uint32_t reg_; 16}; 17 18class TypedOrValueRegister 19{ 20 AlignedStorage2<Register> typed; 21 __attribute__((noinline)) Register& dataTyped() { return *typed.addr(); } 22public: 23 TypedOrValueRegister(Register reg) 24 { 25 dataTyped() = reg; 26 } 27 Register typedReg() const { return *typed.addr(); } 28}; 29 30int main() { 31 Register reg = { 10u }; 32 if (TypedOrValueRegister(reg).typedReg().reg_ != 10) 33 __builtin_abort(); 34 return 0; 35} 36