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