1// { dg-do compile { target c++11 } }
2template<typename T, typename U>
3struct is_same
4{
5  static const bool value = false;
6};
7
8template<typename T>
9struct is_same<T, T>
10{
11  static const bool value = true;
12};
13
14int&& f(const int&) {}
15int&& (*fp)(const int&) = f;
16int&& (&fr)(const int&) = f;
17
18struct X { int&& f(const int&); };
19
20int&& (X::*mfp)(const int&) = &X::f;
21
22void g(X& xr, X* xp)
23{
24  int i;
25  static_assert(is_same<decltype(f(i)), int&&>::value, "direct call");
26  static_assert(is_same<decltype(fp(i)), int&&>::value, "pointer");
27  static_assert(is_same<decltype((*fp)(i)), int&&>::value,
28                "dereferenced pointer");
29  static_assert(is_same<decltype(fr(i)), int&&>::value,
30                "reference");
31  static_assert(is_same<decltype(xr.f(i)), int&&>::value,
32                "member function call");
33  static_assert(is_same<decltype((xr.*mfp)(i)), int&&>::value,
34                "member function pointer with .*");
35  static_assert(is_same<decltype((xp->*mfp)(i)), int&&>::value,
36                "member function pointer with ->*");
37}
38