1 // { dg-do link { target c++11 } }
2 
3 template<typename _Tp>
4 inline _Tp&&
movel(_Tp & __t)5 movel(_Tp& __t)
6 { return static_cast<_Tp&&>(__t); }
7 
8 struct S {};
9 struct T
10 {
TT11   T(S && s_) : s(movel(s_)) {}
getT12   S && get() { return movel(s); }
13   operator S&&() { return movel(s); }
14   S && s;
15   S s2;
16 };
17 
named(S const &)18 void named(S const &) {}
19 void named(S&&);
20 
21 void unnamed(S const &);
unnamed(S &&)22 void unnamed(S&&) {}
23 
f(S && p)24 void f(S && p)
25 {
26   S && s(movel(p));
27   T t(movel(s));
28 
29   named(s);                          // variable reference
30   named(p);                          // parameter reference
31   named(t.s);                        // class member access
32 
33   unnamed(t.get());                  // function return
34   unnamed(t);                        // implicit conversion
35   unnamed(static_cast<S&&>(s));      // cast to rvalue
36   unnamed(static_cast<T&&>(t).s2);   // cast to rvalue
37 }
38 
main()39 int main()
40 {
41 }
42