Home | History | Annotate | Download | only in temp.deduct.type
      1 // RUN: %clang_cc1 -std=c++11 -fsyntax-only -verify %s
      2 // expected-no-diagnostics
      3 
      4 // Deductions specific to C++0x.
      5 
      6 template<typename T>
      7 struct member_pointer_kind {
      8   static const unsigned value = 0;
      9 };
     10 
     11 template<class C, typename R, typename ...Args>
     12 struct member_pointer_kind<R (C::*)(Args...)> {
     13   static const unsigned value = 1;
     14 };
     15 
     16 template<class C, typename R, typename ...Args>
     17 struct member_pointer_kind<R (C::*)(Args...) &> {
     18   static const unsigned value = 2;
     19 };
     20 
     21 template<class C, typename R, typename ...Args>
     22 struct member_pointer_kind<R (C::*)(Args...) &&> {
     23   static const unsigned value = 3;
     24 };
     25 
     26 template<class C, typename R, typename ...Args>
     27 struct member_pointer_kind<R (C::*)(Args...) const> {
     28   static const unsigned value = 4;
     29 };
     30 
     31 template<class C, typename R, typename ...Args>
     32 struct member_pointer_kind<R (C::*)(Args...) const &> {
     33   static const unsigned value = 5;
     34 };
     35 
     36 template<class C, typename R, typename ...Args>
     37 struct member_pointer_kind<R (C::*)(Args...) const &&> {
     38   static const unsigned value = 6;
     39 };
     40 
     41 struct X { };
     42 
     43 static_assert(member_pointer_kind<int (X::*)(int)>::value == 1, "");
     44 static_assert(member_pointer_kind<int (X::*)(int) &>::value == 2, "");
     45 static_assert(member_pointer_kind<int (X::*)(int) &&>::value == 3, "");
     46 static_assert(member_pointer_kind<int (X::*)(int) const>::value == 4, "");
     47 static_assert(member_pointer_kind<int (X::*)(int) const&>::value == 5, "");
     48 static_assert(member_pointer_kind<int (X::*)(int) const&&>::value == 6, "");
     49