// PR c++/58954 // { dg-require-effective-target c++11 } template T&& declval(); template struct foo_argument { template static Arg test(Ret (C::*)(Arg)); typedef decltype(test(&T::template foo<>)) type; }; template struct dependent { typedef T type; }; template struct base { template auto foo(int i) -> decltype(declval< typename dependent::type >().foo_impl(i)); }; struct derived : base { friend struct base; private: int foo_impl(int i); }; int main() { foo_argument::type var = 0; return var; }