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