1// PR c++/48113
2// { dg-do compile { target c++11 } }
3
4template<typename T> T declval();
5
6struct tuple { };
7
8struct F1
9{
10    void operator()(tuple, int);
11};
12
13typedef void (*F2)(tuple, int);
14
15template<typename F, typename T>
16struct Bind
17{
18    template<typename A,
19             typename R = decltype( F()(declval<T&>(), A()) )>
20    R f(A);
21
22    template<typename A,
23             typename R = decltype( F()(declval<volatile T&>(), A()) )>
24    R f(A) volatile;
25};
26
27int main()
28{
29    Bind<F1, tuple>().f(0);  // OK
30    Bind<F2, tuple>().f(0);  // ERROR, should be OK
31}
32