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