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