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