1// RUN: %clang_cc1 -std=c++11 -fsyntax-only -verify %s 2 3struct non_copiable { 4 non_copiable(const non_copiable&) = delete; // expected-note {{marked deleted here}} 5 non_copiable& operator = (const non_copiable&) = delete; // expected-note {{explicitly deleted}} 6 non_copiable() = default; 7}; 8 9struct non_const_copy { 10 non_const_copy(non_const_copy&); 11 non_const_copy& operator = (non_const_copy&) &; 12 non_const_copy& operator = (non_const_copy&) &&; 13 non_const_copy() = default; // expected-note {{not viable}} 14}; 15non_const_copy::non_const_copy(non_const_copy&) = default; // expected-note {{not viable}} 16non_const_copy& non_const_copy::operator = (non_const_copy&) & = default; // expected-note {{not viable}} 17non_const_copy& non_const_copy::operator = (non_const_copy&) && = default; // expected-note {{not viable}} 18 19void fn1 () { 20 non_copiable nc; 21 non_copiable nc2 = nc; // expected-error {{deleted constructor}} 22 nc = nc; // expected-error {{deleted operator}} 23 24 non_const_copy ncc; 25 non_const_copy ncc2 = ncc; 26 ncc = ncc2; 27 const non_const_copy cncc{}; 28 const non_const_copy cncc1; // expected-error {{default initialization of an object of const type 'const non_const_copy' requires a user-provided default constructor}} 29 non_const_copy ncc3 = cncc; // expected-error {{no matching}} 30 ncc = cncc; // expected-error {{no viable overloaded}} 31}; 32 33struct non_const_derived : non_const_copy { 34 non_const_derived(const non_const_derived&) = default; // expected-error {{requires it to be non-const}} 35 non_const_derived& operator =(non_const_derived&) = default; 36}; 37 38struct bad_decls { 39 bad_decls(volatile bad_decls&) = default; // expected-error {{may not be volatile}} 40 bad_decls&& operator = (bad_decls) = default; // expected-error {{lvalue reference}} expected-error {{must return 'bad_decls &'}} 41 bad_decls& operator = (volatile bad_decls&) = default; // expected-error {{may not be volatile}} 42 bad_decls& operator = (const bad_decls&) const = default; // expected-error {{may not have 'const', 'constexpr' or 'volatile' qualifiers}} 43}; 44 45struct A {}; struct B {}; 46 47struct except_spec_a { 48 virtual ~except_spec_a() throw(A); 49 except_spec_a() throw(A); 50}; 51struct except_spec_b { 52 virtual ~except_spec_b() throw(B); 53 except_spec_b() throw(B); 54}; 55 56struct except_spec_d_good : except_spec_a, except_spec_b { 57 ~except_spec_d_good(); 58}; 59except_spec_d_good::~except_spec_d_good() = default; 60struct except_spec_d_good2 : except_spec_a, except_spec_b { 61 ~except_spec_d_good2() = default; 62}; 63struct except_spec_d_bad : except_spec_a, except_spec_b { 64 ~except_spec_d_bad() noexcept; 65}; 66// FIXME: This should error because this exception spec is not 67// compatible with the implicit exception spec. 68except_spec_d_bad::~except_spec_d_bad() noexcept = default; 69 70// FIXME: This should error because this exception spec is not 71// compatible with the implicit exception spec. 72struct except_spec_d_mismatch : except_spec_a, except_spec_b { 73 except_spec_d_mismatch() throw(A) = default; 74}; 75struct except_spec_d_match : except_spec_a, except_spec_b { 76 except_spec_d_match() throw(A, B) = default; 77}; 78 79// gcc-compatibility: allow attributes on default definitions 80// (but not normal definitions) 81struct S { S(); }; 82S::S() __attribute((pure)) = default; 83 84using size_t = decltype(sizeof(0)); 85void *operator new(size_t) = delete; // expected-error {{deleted definition must be first declaration}} expected-note {{implicit}} 86void operator delete(void *) noexcept = delete; // expected-error {{deleted definition must be first declaration}} expected-note {{implicit}} 87