| 1 | // RUN: %clang_cc1 -std=c++98 %s -verify -fexceptions -fcxx-exceptions -pedantic-errors |
| 2 | // RUN: %clang_cc1 -std=c++11 %s -verify -fexceptions -fcxx-exceptions -pedantic-errors |
| 3 | // RUN: %clang_cc1 -std=c++14 %s -verify -fexceptions -fcxx-exceptions -pedantic-errors |
| 4 | // RUN: %clang_cc1 -std=c++1z %s -verify -fexceptions -fcxx-exceptions -pedantic-errors |
| 5 | |
| 6 | namespace std { struct type_info; } |
| 7 | |
| 8 | namespace dr1902 { // dr1902: 3.7 |
| 9 | struct A {}; |
| 10 | struct B { |
| 11 | B(A); |
| 12 | #if __cplusplus >= 201103L |
| 13 | // expected-note@-2 {{candidate}} |
| 14 | #endif |
| 15 | |
| 16 | B() = delete; |
| 17 | #if __cplusplus < 201103L |
| 18 | // expected-error@-2 {{extension}} |
| 19 | #endif |
| 20 | |
| 21 | B(const B&) // expected-note {{deleted here}} |
| 22 | #if __cplusplus >= 201103L |
| 23 | // expected-note@-2 {{candidate}} |
| 24 | #else |
| 25 | // expected-error@+2 {{extension}} |
| 26 | #endif |
| 27 | = delete; |
| 28 | |
| 29 | operator A(); |
| 30 | }; |
| 31 | |
| 32 | extern B b1; |
| 33 | B b2(b1); // expected-error {{call to deleted}} |
| 34 | |
| 35 | #if __cplusplus >= 201103L |
| 36 | // This is ambiguous, even though calling the B(const B&) constructor would |
| 37 | // both directly and indirectly call a deleted function. |
| 38 | B b({}); // expected-error {{ambiguous}} |
| 39 | #endif |
| 40 | } |
| 41 | |
| 42 | namespace dr1903 { |
| 43 | namespace A { |
| 44 | struct a {}; |
| 45 | int a; |
| 46 | namespace B { |
| 47 | int b; |
| 48 | } |
| 49 | using namespace B; |
| 50 | namespace { |
| 51 | int c; |
| 52 | } |
| 53 | namespace D { |
| 54 | int d; |
| 55 | } |
| 56 | using D::d; |
| 57 | } |
| 58 | namespace X { |
| 59 | using A::a; |
| 60 | using A::b; |
| 61 | using A::c; |
| 62 | using A::d; |
| 63 | struct a *p; |
| 64 | } |
| 65 | } |
| 66 | |
| 67 | namespace dr1909 { // dr1909: yes |
| 68 | struct A { |
| 69 | template<typename T> struct A {}; // expected-error {{member 'A' has the same name as its class}} |
| 70 | }; |
| 71 | struct B { |
| 72 | template<typename T> void B() {} // expected-error {{constructor cannot have a return type}} |
| 73 | }; |
| 74 | struct C { |
| 75 | template<typename T> static int C; // expected-error {{member 'C' has the same name as its class}} expected-error 0-1{{extension}} |
| 76 | }; |
| 77 | struct D { |
| 78 | template<typename T> using D = int; // expected-error {{member 'D' has the same name as its class}} expected-error 0-1{{extension}} |
| 79 | }; |
| 80 | } |
| 81 | |
| 82 | namespace dr1940 { // dr1940: yes |
| 83 | #if __cplusplus >= 201103L |
| 84 | static union { |
| 85 | static_assert(true, ""); // ok |
| 86 | static_assert(false, ""); // expected-error {{static_assert failed}} |
| 87 | }; |
| 88 | #endif |
| 89 | } |
| 90 | |
| 91 | namespace dr1941 { // dr1941: 3.9 |
| 92 | #if __cplusplus >= 201402L |
| 93 | template<typename X> |
| 94 | struct base { |
| 95 | template<typename T> |
| 96 | base(T a, T b, decltype(void(*T()), 0) = 0) { |
| 97 | while (a != b) (void)*a++; |
| 98 | } |
| 99 | |
| 100 | template<typename T> |
| 101 | base(T a, X x, decltype(void(T(0) * 1), 0) = 0) { |
| 102 | for (T n = 0; n != a; ++n) (void)X(x); |
| 103 | } |
| 104 | }; |
| 105 | |
| 106 | struct derived : base<int> { |
| 107 | using base::base; |
| 108 | }; |
| 109 | |
| 110 | struct iter { |
| 111 | iter operator++(int); |
| 112 | int operator*(); |
| 113 | friend bool operator!=(iter, iter); |
| 114 | } it, end; |
| 115 | |
| 116 | derived d1(it, end); |
| 117 | derived d2(42, 9); |
| 118 | #endif |
| 119 | } |
| 120 | |
| 121 | namespace dr1947 { // dr1947: yes |
| 122 | #if __cplusplus >= 201402L |
| 123 | unsigned o = 0'01; // ok |
| 124 | unsigned b = 0b'01; // expected-error {{invalid digit 'b' in octal constant}} |
| 125 | unsigned x = 0x'01; // expected-error {{invalid suffix 'x'01' on integer constant}} |
| 126 | #endif |
| 127 | } |
| 128 | |
| 129 | #if __cplusplus >= 201103L |
| 130 | // dr1948: yes |
| 131 | // FIXME: This diagnostic could be improved. |
| 132 | void *operator new(__SIZE_TYPE__) noexcept { return nullptr; } // expected-error{{exception specification in declaration does not match previous declaration}} |
| 133 | #endif |
| 134 | |
| 135 | namespace dr1959 { // dr1959: 3.9 |
| 136 | #if __cplusplus >= 201103L |
| 137 | struct b; |
| 138 | struct c; |
| 139 | struct a { |
| 140 | a() = default; |
| 141 | a(const a &) = delete; // expected-note {{deleted}} |
| 142 | a(const b &) = delete; // not inherited |
| 143 | a(c &&) = delete; // expected-note {{not viable}} |
| 144 | template<typename T> a(T) = delete; // expected-note {{would take its own class type by value}} |
| 145 | }; |
| 146 | |
| 147 | struct b : a { // expected-note {{cannot bind}} expected-note {{deleted because}} |
| 148 | using a::a; // expected-note 2{{inherited here}} |
| 149 | }; |
| 150 | |
| 151 | a x; |
| 152 | // FIXME: As a resolution to an open DR against P0136R0, we disallow |
| 153 | // use of inherited constructors to construct from a single argument |
| 154 | // where the base class is reference-related to the argument type. |
| 155 | b y = x; // expected-error {{no viable conversion}} |
| 156 | b z = z; // expected-error {{deleted}} |
| 157 | |
| 158 | struct c : a { |
| 159 | using a::a; |
| 160 | c(const c &); |
| 161 | }; |
| 162 | // FIXME: As a resolution to an open DR against P0136R0, we disallow |
| 163 | // use of inherited constructors to construct from a single argument |
| 164 | // where the base class is reference-related to the argument type. |
| 165 | c q(static_cast<c&&>(q)); |
| 166 | #endif |
| 167 | } |
| 168 | |
| 169 | namespace dr1968 { // dr1968: yes |
| 170 | #if __cplusplus >= 201103L |
| 171 | static_assert(&typeid(int) == &typeid(int), ""); // expected-error{{not an integral constant expression}} |
| 172 | #endif |
| 173 | } |
| 174 | |
| 175 | namespace dr1991 { // dr1991: 3.9 |
| 176 | #if __cplusplus >= 201103L |
| 177 | struct A { |
| 178 | A(int, int) = delete; |
| 179 | }; |
| 180 | |
| 181 | struct B : A { |
| 182 | using A::A; |
| 183 | B(int, int, int = 0); |
| 184 | }; |
| 185 | |
| 186 | // FIXME: As a resolution to an open DR against P0136R1, we treat derived |
| 187 | // class constructors as better than base class constructors in the presence |
| 188 | // of ambiguity. |
| 189 | B b(0, 0); // ok, calls B constructor |
| 190 | #endif |
| 191 | } |
| 192 | |
| 193 | // dr1994: dup 529 |
| 194 | |