1 // PR c++/54738 2 // { dg-do compile { target c++11 } } 3 4 template<class T> 5 T&& declval(); 6 7 template<class F, class T1, class... Ts> 8 decltype(((*declval<T1>()).*declval<F>())(declval<Ts>()...)) 9 test1(int); 10 11 template<class...> 12 void test1(...); 13 14 template<class F, class T1, class... Ts> 15 decltype((declval<T1>().*declval<F>())(declval<Ts>()...)) 16 test2(int); 17 18 template<class...> 19 void test2(...); 20 21 struct S {}; 22 23 typedef void (S::*Func)(int) const; 24 typedef void (S::*Func2)(int); 25 26 typedef decltype(test1<Func, S*>(0)) type1a; 27 typedef decltype(test1<Func, S*&>(0)) type1b; 28 typedef decltype(test1<Func, S*, int, int>(0)) type1c; 29 typedef decltype(test1<Func, S*&, int, int>(0)) type1d; 30 31 typedef decltype(test2<Func, S>(0)) type2a; 32 typedef decltype(test2<Func, S&>(0)) type2b; 33 typedef decltype(test2<Func, S, int, int>(0)) type2c; 34 typedef decltype(test2<Func, S&, int, int>(0)) type2d; 35 36 typedef decltype(test1<Func, S*, S>(0)) type3a; 37 typedef decltype(test1<Func, S*&, S>(0)) type3b; 38 39 typedef decltype(test2<Func, S, S>(0)) type4a; 40 typedef decltype(test2<Func, S&, S>(0)) type4b; 41 42 typedef decltype(test1<Func2, const S*, int>(0)) type5a; 43 typedef decltype(test1<Func2, const S*&, int>(0)) type5b; 44 45 typedef decltype(test2<Func2, const S, int>(0)) type6a; 46 typedef decltype(test2<Func2, const S&, int>(0)) type6b; 47