1*67e74705SXin Li // RUN: %clang_cc1 -std=c++11 -fsyntax-only -verify %s 2*67e74705SXin Li // expected-no-diagnostics 3*67e74705SXin Li 4*67e74705SXin Li template<typename T> 5*67e74705SXin Li struct classify_function { 6*67e74705SXin Li static const unsigned value = 0; 7*67e74705SXin Li }; 8*67e74705SXin Li 9*67e74705SXin Li template<typename R, typename ...Args> 10*67e74705SXin Li struct classify_function<R(Args...)> { 11*67e74705SXin Li static const unsigned value = 1; 12*67e74705SXin Li }; 13*67e74705SXin Li 14*67e74705SXin Li template<typename R, typename ...Args> 15*67e74705SXin Li struct classify_function<R(Args...) const> { 16*67e74705SXin Li static const unsigned value = 2; 17*67e74705SXin Li }; 18*67e74705SXin Li 19*67e74705SXin Li template<typename R, typename ...Args> 20*67e74705SXin Li struct classify_function<R(Args...) volatile> { 21*67e74705SXin Li static const unsigned value = 3; 22*67e74705SXin Li }; 23*67e74705SXin Li 24*67e74705SXin Li template<typename R, typename ...Args> 25*67e74705SXin Li struct classify_function<R(Args...) const volatile> { 26*67e74705SXin Li static const unsigned value = 4; 27*67e74705SXin Li }; 28*67e74705SXin Li 29*67e74705SXin Li template<typename R, typename ...Args> 30*67e74705SXin Li struct classify_function<R(Args..., ...)> { 31*67e74705SXin Li static const unsigned value = 5; 32*67e74705SXin Li }; 33*67e74705SXin Li 34*67e74705SXin Li template<typename R, typename ...Args> 35*67e74705SXin Li struct classify_function<R(Args..., ...) const> { 36*67e74705SXin Li static const unsigned value = 6; 37*67e74705SXin Li }; 38*67e74705SXin Li 39*67e74705SXin Li template<typename R, typename ...Args> 40*67e74705SXin Li struct classify_function<R(Args..., ...) volatile> { 41*67e74705SXin Li static const unsigned value = 7; 42*67e74705SXin Li }; 43*67e74705SXin Li 44*67e74705SXin Li template<typename R, typename ...Args> 45*67e74705SXin Li struct classify_function<R(Args..., ...) const volatile> { 46*67e74705SXin Li static const unsigned value = 8; 47*67e74705SXin Li }; 48*67e74705SXin Li 49*67e74705SXin Li template<typename R, typename ...Args> 50*67e74705SXin Li struct classify_function<R(Args..., ...) &&> { 51*67e74705SXin Li static const unsigned value = 9; 52*67e74705SXin Li }; 53*67e74705SXin Li 54*67e74705SXin Li template<typename R, typename ...Args> 55*67e74705SXin Li struct classify_function<R(Args..., ...) const &> { 56*67e74705SXin Li static const unsigned value = 10; 57*67e74705SXin Li }; 58*67e74705SXin Li 59*67e74705SXin Li typedef void f0(int) const; 60*67e74705SXin Li typedef void f1(int, float...) const volatile; 61*67e74705SXin Li typedef void f2(int, double, ...) &&; 62*67e74705SXin Li typedef void f3(int, double, ...) const &; 63*67e74705SXin Li 64*67e74705SXin Li int check0[classify_function<f0>::value == 2? 1 : -1]; 65*67e74705SXin Li int check1[classify_function<f1>::value == 8? 1 : -1]; 66*67e74705SXin Li int check2[classify_function<f2>::value == 9? 1 : -1]; 67*67e74705SXin Li int check3[classify_function<f3>::value == 10? 1 : -1]; 68