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