// RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 %s
// expected-no-diagnostics
#if !__has_feature(cxx_access_control_sfinae)
# error No support for access control as part of SFINAE?
#endif
typedef char yes_type;
typedef char (&no_type)[2];
template<unsigned N> struct unsigned_c { };
template<typename T>
class has_copy_constructor {
static T t;
template<typename U> static yes_type check(unsigned_c<sizeof(U(t))> * = 0);
template<typename U> static no_type check(...);
public:
static const bool value = (sizeof(check<T>(0)) == sizeof(yes_type));
};
struct HasCopy { };
struct HasNonConstCopy {
HasNonConstCopy(HasNonConstCopy&);
};
struct HasDeletedCopy {
HasDeletedCopy(const HasDeletedCopy&) = delete;
};
struct HasPrivateCopy {
private:
HasPrivateCopy(const HasPrivateCopy&);
};
int check0[has_copy_constructor<HasCopy>::value? 1 : -1];
int check1[has_copy_constructor<HasNonConstCopy>::value? 1 : -1];
int check2[has_copy_constructor<HasDeletedCopy>::value? -1 : 1];
int check3[has_copy_constructor<HasPrivateCopy>::value? -1 : 1];