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