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