19ca5c425SRichard Smith // RUN: %clang_cc1 -std=c++11 -fsyntax-only -verify %s 2c6e68daaSAndy Gibbs // expected-no-diagnostics 3205d5e3aSDouglas Gregor 4205d5e3aSDouglas Gregor template<typename T> 5205d5e3aSDouglas Gregor struct classify_function { 6205d5e3aSDouglas Gregor static const unsigned value = 0; 7205d5e3aSDouglas Gregor }; 8205d5e3aSDouglas Gregor 9205d5e3aSDouglas Gregor template<typename R, typename ...Args> 10205d5e3aSDouglas Gregor struct classify_function<R(Args...)> { 11205d5e3aSDouglas Gregor static const unsigned value = 1; 12205d5e3aSDouglas Gregor }; 13205d5e3aSDouglas Gregor 14205d5e3aSDouglas Gregor template<typename R, typename ...Args> 1563168c75SRichard Smith struct classify_function<R(Args...) const> { 16205d5e3aSDouglas Gregor static const unsigned value = 2; 17205d5e3aSDouglas Gregor }; 18205d5e3aSDouglas Gregor 19205d5e3aSDouglas Gregor template<typename R, typename ...Args> 2063168c75SRichard Smith struct classify_function<R(Args...) volatile> { 21205d5e3aSDouglas Gregor static const unsigned value = 3; 22205d5e3aSDouglas Gregor }; 23205d5e3aSDouglas Gregor 24205d5e3aSDouglas Gregor template<typename R, typename ...Args> 2563168c75SRichard Smith struct classify_function<R(Args...) const volatile> { 26205d5e3aSDouglas Gregor static const unsigned value = 4; 27205d5e3aSDouglas Gregor }; 28205d5e3aSDouglas Gregor 29205d5e3aSDouglas Gregor template<typename R, typename ...Args> 30*36ee9fb2SRichard Smith struct classify_function<R(Args..., ...)> { 31205d5e3aSDouglas Gregor static const unsigned value = 5; 32205d5e3aSDouglas Gregor }; 33205d5e3aSDouglas Gregor 34205d5e3aSDouglas Gregor template<typename R, typename ...Args> 35*36ee9fb2SRichard Smith struct classify_function<R(Args..., ...) const> { 36205d5e3aSDouglas Gregor static const unsigned value = 6; 37205d5e3aSDouglas Gregor }; 38205d5e3aSDouglas Gregor 39205d5e3aSDouglas Gregor template<typename R, typename ...Args> 40*36ee9fb2SRichard Smith struct classify_function<R(Args..., ...) volatile> { 41205d5e3aSDouglas Gregor static const unsigned value = 7; 42205d5e3aSDouglas Gregor }; 43205d5e3aSDouglas Gregor 44205d5e3aSDouglas Gregor template<typename R, typename ...Args> 45*36ee9fb2SRichard Smith struct classify_function<R(Args..., ...) const volatile> { 46205d5e3aSDouglas Gregor static const unsigned value = 8; 47205d5e3aSDouglas Gregor }; 48205d5e3aSDouglas Gregor 49205d5e3aSDouglas Gregor template<typename R, typename ...Args> 50*36ee9fb2SRichard Smith struct classify_function<R(Args..., ...) &&> { 51205d5e3aSDouglas Gregor static const unsigned value = 9; 52205d5e3aSDouglas Gregor }; 53205d5e3aSDouglas Gregor 54205d5e3aSDouglas Gregor template<typename R, typename ...Args> 55*36ee9fb2SRichard Smith struct classify_function<R(Args..., ...) const &> { 56205d5e3aSDouglas Gregor static const unsigned value = 10; 57205d5e3aSDouglas Gregor }; 58205d5e3aSDouglas Gregor 59205d5e3aSDouglas Gregor typedef void f0(int) const; 60205d5e3aSDouglas Gregor typedef void f1(int, float...) const volatile; 61205d5e3aSDouglas Gregor typedef void f2(int, double, ...) &&; 62205d5e3aSDouglas Gregor typedef void f3(int, double, ...) const &; 63205d5e3aSDouglas Gregor 64205d5e3aSDouglas Gregor int check0[classify_function<f0>::value == 2? 1 : -1]; 65205d5e3aSDouglas Gregor int check1[classify_function<f1>::value == 8? 1 : -1]; 66205d5e3aSDouglas Gregor int check2[classify_function<f2>::value == 9? 1 : -1]; 67205d5e3aSDouglas Gregor int check3[classify_function<f3>::value == 10? 1 : -1]; 68