1762bb9d0ad20320b9f97a841dce57ba5e8e48b07Richard Smith// RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 %s
28e8fb3be5bd78f0564444eca02b404566a5f3b5dAndy Gibbs// expected-no-diagnostics
37822ee3ef9f0d5cfd289258614ac31be70097449Douglas Gregor
47822ee3ef9f0d5cfd289258614ac31be70097449Douglas Gregor#if !__has_feature(cxx_access_control_sfinae)
57822ee3ef9f0d5cfd289258614ac31be70097449Douglas Gregor#  error No support for access control as part of SFINAE?
67822ee3ef9f0d5cfd289258614ac31be70097449Douglas Gregor#endif
77822ee3ef9f0d5cfd289258614ac31be70097449Douglas Gregor
87822ee3ef9f0d5cfd289258614ac31be70097449Douglas Gregortypedef char yes_type;
97822ee3ef9f0d5cfd289258614ac31be70097449Douglas Gregortypedef char (&no_type)[2];
107822ee3ef9f0d5cfd289258614ac31be70097449Douglas Gregor
117822ee3ef9f0d5cfd289258614ac31be70097449Douglas Gregortemplate<unsigned N> struct unsigned_c { };
127822ee3ef9f0d5cfd289258614ac31be70097449Douglas Gregor
137822ee3ef9f0d5cfd289258614ac31be70097449Douglas Gregortemplate<typename T>
147822ee3ef9f0d5cfd289258614ac31be70097449Douglas Gregorclass has_copy_constructor {
157822ee3ef9f0d5cfd289258614ac31be70097449Douglas Gregor  static T t;
167822ee3ef9f0d5cfd289258614ac31be70097449Douglas Gregor
177822ee3ef9f0d5cfd289258614ac31be70097449Douglas Gregor  template<typename U> static yes_type check(unsigned_c<sizeof(U(t))> * = 0);
187822ee3ef9f0d5cfd289258614ac31be70097449Douglas Gregor  template<typename U> static no_type check(...);
197822ee3ef9f0d5cfd289258614ac31be70097449Douglas Gregor
207822ee3ef9f0d5cfd289258614ac31be70097449Douglas Gregorpublic:
217822ee3ef9f0d5cfd289258614ac31be70097449Douglas Gregor  static const bool value = (sizeof(check<T>(0)) == sizeof(yes_type));
227822ee3ef9f0d5cfd289258614ac31be70097449Douglas Gregor};
237822ee3ef9f0d5cfd289258614ac31be70097449Douglas Gregor
247822ee3ef9f0d5cfd289258614ac31be70097449Douglas Gregorstruct HasCopy { };
257822ee3ef9f0d5cfd289258614ac31be70097449Douglas Gregor
267822ee3ef9f0d5cfd289258614ac31be70097449Douglas Gregorstruct HasNonConstCopy {
277822ee3ef9f0d5cfd289258614ac31be70097449Douglas Gregor  HasNonConstCopy(HasNonConstCopy&);
287822ee3ef9f0d5cfd289258614ac31be70097449Douglas Gregor};
297822ee3ef9f0d5cfd289258614ac31be70097449Douglas Gregor
307822ee3ef9f0d5cfd289258614ac31be70097449Douglas Gregorstruct HasDeletedCopy {
317822ee3ef9f0d5cfd289258614ac31be70097449Douglas Gregor  HasDeletedCopy(const HasDeletedCopy&) = delete;
327822ee3ef9f0d5cfd289258614ac31be70097449Douglas Gregor};
337822ee3ef9f0d5cfd289258614ac31be70097449Douglas Gregor
347822ee3ef9f0d5cfd289258614ac31be70097449Douglas Gregorstruct HasPrivateCopy {
357822ee3ef9f0d5cfd289258614ac31be70097449Douglas Gregorprivate:
367822ee3ef9f0d5cfd289258614ac31be70097449Douglas Gregor  HasPrivateCopy(const HasPrivateCopy&);
377822ee3ef9f0d5cfd289258614ac31be70097449Douglas Gregor};
387822ee3ef9f0d5cfd289258614ac31be70097449Douglas Gregor
397822ee3ef9f0d5cfd289258614ac31be70097449Douglas Gregorint check0[has_copy_constructor<HasCopy>::value? 1 : -1];
407822ee3ef9f0d5cfd289258614ac31be70097449Douglas Gregorint check1[has_copy_constructor<HasNonConstCopy>::value? 1 : -1];
417822ee3ef9f0d5cfd289258614ac31be70097449Douglas Gregorint check2[has_copy_constructor<HasDeletedCopy>::value? -1 : 1];
427822ee3ef9f0d5cfd289258614ac31be70097449Douglas Gregorint check3[has_copy_constructor<HasPrivateCopy>::value? -1 : 1];
43