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