1// PR c++/58954 2// { dg-require-effective-target c++11 } 3 4template<class T> 5T&& declval(); 6 7template<class T> 8struct foo_argument 9{ 10 template<class Ret, class C, class Arg> 11 static Arg test(Ret (C::*)(Arg)); 12 13 typedef decltype(test(&T::template foo<>)) type; 14}; 15 16template<class T, class> 17struct dependent { typedef T type; }; 18 19template<class T> 20struct base 21{ 22 template<class Ignore = void> 23 auto foo(int i) -> decltype(declval< 24 typename dependent<T&, Ignore>::type 25 >().foo_impl(i)); 26}; 27 28struct derived : base<derived> 29{ 30 friend struct base<derived>; 31private: 32 int foo_impl(int i); 33}; 34 35int main() 36{ 37 foo_argument<derived>::type var = 0; 38 return var; 39} 40