1 // I, Howard Hinnant, hereby place this code in the public domain.
2 
3 // Test: Unamed rvalue references are treated as lvalues.
4 
5 // { dg-do compile { target c++11 } }
6 
7 template <bool> struct sa;
8 template <> struct sa<true> {};
9 
10 struct one   {long x[1];};
11 struct two   {long x[2];};
12 
13 struct A {};
14 
15 one foo(const A&) {return one();}
16 two foo(A&&)      {return two();}
17 
18 template<typename _Tp>
19 inline _Tp&&
20 movel(_Tp& __t)
21 { return static_cast<_Tp&&>(__t); }
22 
23 A&& source() {static A a; return movel(a);}
24 
25 int test1()
26 {
27     sa<sizeof(foo(source())) == 2 * sizeof(long)> t1;
28     return 0;
29 }
30 
31 int main()
32 {
33     return test1();
34 }
35