1 // PR c++/58954
2 // { dg-require-effective-target c++11 }
3 
4 template<class T>
5 T&& declval();
6 
7 template<class T>
8 struct 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 
16 template<class T, class>
17 struct dependent { typedef T type; };
18 
19 template<class T>
20 struct 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 
28 struct derived : base<derived>
29 {
30   friend struct base<derived>;
31 private:
32   int foo_impl(int i);
33 };
34 
35 int main()
36 {
37   foo_argument<derived>::type var = 0;
38   return var;
39 }
40