| // { dg-do compile { target c++11 } } |
| // { dg-additional-options "-Wno-return-type" } |
| |
| template<typename T, typename U> |
| struct is_same |
| { |
| static const bool value = false; |
| }; |
| |
| template<typename T> |
| struct is_same<T, T> |
| { |
| static const bool value = true; |
| }; |
| |
| int&& f(const int&) {} |
| int&& (*fp)(const int&) = f; |
| int&& (&fr)(const int&) = f; |
| |
| struct X { int&& f(const int&); }; |
| |
| int&& (X::*mfp)(const int&) = &X::f; |
| |
| void g(X& xr, X* xp) |
| { |
| int i; |
| static_assert(is_same<decltype(f(i)), int&&>::value, "direct call"); |
| static_assert(is_same<decltype(fp(i)), int&&>::value, "pointer"); |
| static_assert(is_same<decltype((*fp)(i)), int&&>::value, |
| "dereferenced pointer"); |
| static_assert(is_same<decltype(fr(i)), int&&>::value, |
| "reference"); |
| static_assert(is_same<decltype(xr.f(i)), int&&>::value, |
| "member function call"); |
| static_assert(is_same<decltype((xr.*mfp)(i)), int&&>::value, |
| "member function pointer with .*"); |
| static_assert(is_same<decltype((xp->*mfp)(i)), int&&>::value, |
| "member function pointer with ->*"); |
| } |