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