1 // RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 %s 2 // expected-no-diagnostics 3 4 #if !__has_feature(cxx_access_control_sfinae) 5 # error No support for access control as part of SFINAE? 6 #endif 7 8 typedef char yes_type; 9 typedef char (&no_type)[2]; 10 11 template<unsigned N> struct unsigned_c { }; 12 13 template<typename T> 14 class has_copy_constructor { 15 static T t; 16 17 template<typename U> static yes_type check(unsigned_c<sizeof(U(t))> * = 0); 18 template<typename U> static no_type check(...); 19 20 public: 21 static const bool value = (sizeof(check<T>(0)) == sizeof(yes_type)); 22 }; 23 24 struct HasCopy { }; 25 26 struct HasNonConstCopy { 27 HasNonConstCopy(HasNonConstCopy&); 28 }; 29 30 struct HasDeletedCopy { 31 HasDeletedCopy(const HasDeletedCopy&) = delete; 32 }; 33 34 struct HasPrivateCopy { 35 private: 36 HasPrivateCopy(const HasPrivateCopy&); 37 }; 38 39 int check0[has_copy_constructor<HasCopy>::value? 1 : -1]; 40 int check1[has_copy_constructor<HasNonConstCopy>::value? 1 : -1]; 41 int check2[has_copy_constructor<HasDeletedCopy>::value? -1 : 1]; 42 int check3[has_copy_constructor<HasPrivateCopy>::value? -1 : 1]; 43