| 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 | #if __cplusplus < 201103L |
| 7 | // expected-no-diagnostics |
| 8 | #endif |
| 9 | |
| 10 | // dr1425: na abi |
| 11 | |
| 12 | namespace dr1460 { // dr1460: 3.5 |
| 13 | #if __cplusplus >= 201103L |
| 14 | namespace DRExample { |
| 15 | union A { |
| 16 | union {}; |
| 17 | union {}; |
| 18 | constexpr A() {} |
| 19 | }; |
| 20 | constexpr A a = A(); |
| 21 | |
| 22 | union B { |
| 23 | union {}; |
| 24 | union {}; |
| 25 | constexpr B() = default; |
| 26 | }; |
| 27 | constexpr B b = B(); |
| 28 | |
| 29 | union C { |
| 30 | union {}; |
| 31 | union {}; |
| 32 | }; |
| 33 | constexpr C c = C(); |
| 34 | #if __cplusplus > 201103L |
| 35 | constexpr void f() { C c; } |
| 36 | static_assert((f(), true), ""); |
| 37 | #endif |
| 38 | } |
| 39 | |
| 40 | union A {}; |
| 41 | union B { int n; }; // expected-note +{{here}} |
| 42 | union C { int n = 0; }; |
| 43 | struct D { union {}; }; |
| 44 | struct E { union { int n; }; }; // expected-note +{{here}} |
| 45 | struct F { union { int n = 0; }; }; |
| 46 | |
| 47 | struct X { |
| 48 | friend constexpr A::A() noexcept; |
| 49 | friend constexpr B::B() noexcept; // expected-error {{follows non-constexpr declaration}} |
| 50 | friend constexpr C::C() noexcept; |
| 51 | friend constexpr D::D() noexcept; |
| 52 | friend constexpr E::E() noexcept; // expected-error {{follows non-constexpr declaration}} |
| 53 | friend constexpr F::F() noexcept; |
| 54 | }; |
| 55 | |
| 56 | // These are OK, because value-initialization doesn't actually invoke the |
| 57 | // constructor. |
| 58 | constexpr A a = A(); |
| 59 | constexpr B b = B(); |
| 60 | constexpr C c = C(); |
| 61 | constexpr D d = D(); |
| 62 | constexpr E e = E(); |
| 63 | constexpr F f = F(); |
| 64 | |
| 65 | namespace Defaulted { |
| 66 | union A { constexpr A() = default; }; |
| 67 | union B { int n; constexpr B() = default; }; // expected-error {{not constexpr}} |
| 68 | union C { int n = 0; constexpr C() = default; }; |
| 69 | struct D { union {}; constexpr D() = default; }; |
| 70 | struct E { union { int n; }; constexpr E() = default; }; // expected-error {{not constexpr}} |
| 71 | struct F { union { int n = 0; }; constexpr F() = default; }; |
| 72 | |
| 73 | struct G { union { int n = 0; }; union { int m; }; constexpr G() = default; }; // expected-error {{not constexpr}} |
| 74 | struct H { |
| 75 | union { |
| 76 | int n = 0; |
| 77 | }; |
| 78 | union { // expected-note 2{{member not initialized}} |
| 79 | int m; |
| 80 | }; |
| 81 | constexpr H() {} // expected-error {{must initialize all members}} |
| 82 | constexpr H(bool) : m(1) {} |
| 83 | constexpr H(char) : n(1) {} // expected-error {{must initialize all members}} |
| 84 | constexpr H(double) : m(1), n(1) {} |
| 85 | }; |
| 86 | } |
| 87 | |
| 88 | #if __cplusplus > 201103L |
| 89 | template<typename T> constexpr bool check() { |
| 90 | T t; // expected-note-re 2{{non-constexpr constructor '{{[BE]}}'}} |
| 91 | return true; |
| 92 | } |
| 93 | static_assert(check<A>(), ""); |
| 94 | static_assert(check<B>(), ""); // expected-error {{constant}} expected-note {{in call}} |
| 95 | static_assert(check<C>(), ""); |
| 96 | static_assert(check<D>(), ""); |
| 97 | static_assert(check<E>(), ""); // expected-error {{constant}} expected-note {{in call}} |
| 98 | static_assert(check<F>(), ""); |
| 99 | #endif |
| 100 | |
| 101 | union G { |
| 102 | int a = 0; // expected-note {{previous initialization is here}} |
| 103 | int b = 0; // expected-error {{initializing multiple members of union}} |
| 104 | }; |
| 105 | union H { |
| 106 | union { |
| 107 | int a = 0; // expected-note {{previous initialization is here}} |
| 108 | }; |
| 109 | union { |
| 110 | int b = 0; // expected-error {{initializing multiple members of union}} |
| 111 | }; |
| 112 | }; |
| 113 | struct I { |
| 114 | union { |
| 115 | int a = 0; // expected-note {{previous initialization is here}} |
| 116 | int b = 0; // expected-error {{initializing multiple members of union}} |
| 117 | }; |
| 118 | }; |
| 119 | struct J { |
| 120 | union { int a = 0; }; |
| 121 | union { int b = 0; }; |
| 122 | }; |
| 123 | |
| 124 | namespace Overriding { |
| 125 | struct A { |
| 126 | int a = 1, b, c = 3; |
| 127 | constexpr A() : b(2) {} |
| 128 | }; |
| 129 | static_assert(A().a == 1 && A().b == 2 && A().c == 3, ""); |
| 130 | |
| 131 | union B { |
| 132 | int a, b = 2, c; |
| 133 | constexpr B() : a(1) {} |
| 134 | constexpr B(char) : b(4) {} |
| 135 | constexpr B(int) : c(3) {} |
| 136 | constexpr B(const char*) {} |
| 137 | }; |
| 138 | static_assert(B().a == 1, ""); |
| 139 | static_assert(B().b == 2, ""); // expected-error {{constant}} expected-note {{read of}} |
| 140 | static_assert(B('x').a == 0, ""); // expected-error {{constant}} expected-note {{read of}} |
| 141 | static_assert(B('x').b == 4, ""); |
| 142 | static_assert(B(123).b == 2, ""); // expected-error {{constant}} expected-note {{read of}} |
| 143 | static_assert(B(123).c == 3, ""); |
| 144 | static_assert(B("").a == 1, ""); // expected-error {{constant}} expected-note {{read of}} |
| 145 | static_assert(B("").b == 2, ""); |
| 146 | static_assert(B("").c == 3, ""); // expected-error {{constant}} expected-note {{read of}} |
| 147 | |
| 148 | struct C { |
| 149 | union { int a, b = 2, c; }; |
| 150 | union { int d, e = 5, f; }; |
| 151 | constexpr C() : a(1) {} |
| 152 | constexpr C(char) : c(3) {} |
| 153 | constexpr C(int) : d(4) {} |
| 154 | constexpr C(float) : f(6) {} |
| 155 | constexpr C(const char*) {} |
| 156 | }; |
| 157 | |
| 158 | static_assert(C().a == 1, ""); |
| 159 | static_assert(C().b == 2, ""); // expected-error {{constant}} expected-note {{read of}} |
| 160 | static_assert(C().d == 4, ""); // expected-error {{constant}} expected-note {{read of}} |
| 161 | static_assert(C().e == 5, ""); |
| 162 | |
| 163 | static_assert(C('x').b == 2, ""); // expected-error {{constant}} expected-note {{read of}} |
| 164 | static_assert(C('x').c == 3, ""); |
| 165 | static_assert(C('x').d == 4, ""); // expected-error {{constant}} expected-note {{read of}} |
| 166 | static_assert(C('x').e == 5, ""); |
| 167 | |
| 168 | static_assert(C(1).b == 2, ""); |
| 169 | static_assert(C(1).c == 3, ""); // expected-error {{constant}} expected-note {{read of}} |
| 170 | static_assert(C(1).d == 4, ""); |
| 171 | static_assert(C(1).e == 5, ""); // expected-error {{constant}} expected-note {{read of}} |
| 172 | |
| 173 | static_assert(C(1.f).b == 2, ""); |
| 174 | static_assert(C(1.f).c == 3, ""); // expected-error {{constant}} expected-note {{read of}} |
| 175 | static_assert(C(1.f).e == 5, ""); // expected-error {{constant}} expected-note {{read of}} |
| 176 | static_assert(C(1.f).f == 6, ""); |
| 177 | |
| 178 | static_assert(C("").a == 1, ""); // expected-error {{constant}} expected-note {{read of}} |
| 179 | static_assert(C("").b == 2, ""); |
| 180 | static_assert(C("").c == 3, ""); // expected-error {{constant}} expected-note {{read of}} |
| 181 | static_assert(C("").d == 4, ""); // expected-error {{constant}} expected-note {{read of}} |
| 182 | static_assert(C("").e == 5, ""); |
| 183 | static_assert(C("").f == 6, ""); // expected-error {{constant}} expected-note {{read of}} |
| 184 | |
| 185 | struct D; |
| 186 | extern const D d; |
| 187 | struct D { |
| 188 | int a; |
| 189 | union { |
| 190 | int b = const_cast<D&>(d).a = 1; // not evaluated |
| 191 | int c; |
| 192 | }; |
| 193 | constexpr D() : a(0), c(0) {} |
| 194 | }; |
| 195 | constexpr D d {}; |
| 196 | static_assert(d.a == 0, ""); |
| 197 | } |
| 198 | #endif |
| 199 | } |
| 200 | |
| 201 | #if __cplusplus >= 201103L |
| 202 | namespace std { |
| 203 | typedef decltype(sizeof(int)) size_t; |
| 204 | |
| 205 | // libc++'s implementation |
| 206 | template <class _E> |
| 207 | class initializer_list |
| 208 | { |
| 209 | const _E* __begin_; |
| 210 | size_t __size_; |
| 211 | |
| 212 | initializer_list(const _E* __b, size_t __s) |
| 213 | : __begin_(__b), __size_(__s) {} |
| 214 | |
| 215 | public: |
| 216 | typedef _E value_type; |
| 217 | typedef const _E& reference; |
| 218 | typedef const _E& const_reference; |
| 219 | typedef size_t size_type; |
| 220 | |
| 221 | typedef const _E* iterator; |
| 222 | typedef const _E* const_iterator; |
| 223 | |
| 224 | initializer_list() : __begin_(nullptr), __size_(0) {} |
| 225 | |
| 226 | size_t size() const {return __size_;} |
| 227 | const _E* begin() const {return __begin_;} |
| 228 | const _E* end() const {return __begin_ + __size_;} |
| 229 | }; |
| 230 | } // std |
| 231 | |
| 232 | namespace dr1467 { // dr1467: 3.7 c++11 |
| 233 | // List-initialization of aggregate from same-type object |
| 234 | |
| 235 | namespace basic0 { |
| 236 | struct S { |
| 237 | int i = 42; |
| 238 | }; |
| 239 | |
| 240 | S a; |
| 241 | S b(a); |
| 242 | S c{a}; |
| 243 | |
| 244 | struct SS : public S { } x; |
| 245 | S y(x); |
| 246 | S z{x}; |
| 247 | } // basic0 |
| 248 | |
| 249 | namespace basic1 { |
| 250 | struct S { |
| 251 | int i{42}; |
| 252 | }; |
| 253 | |
| 254 | S a; |
| 255 | S b(a); |
| 256 | S c{a}; |
| 257 | |
| 258 | struct SS : public S { } x; |
| 259 | S y(x); |
| 260 | S z{x}; |
| 261 | } // basic1 |
| 262 | |
| 263 | namespace basic2 { |
| 264 | struct S { |
| 265 | int i = {42}; |
| 266 | }; |
| 267 | |
| 268 | S a; |
| 269 | S b(a); |
| 270 | S c{a}; |
| 271 | |
| 272 | struct SS : public S { } x; |
| 273 | S y(x); |
| 274 | S z{x}; |
| 275 | } // basic2 |
| 276 | |
| 277 | namespace dr_example { |
| 278 | struct OK { |
| 279 | OK() = default; |
| 280 | OK(const OK&) = default; |
| 281 | OK(int) { } |
| 282 | }; |
| 283 | |
| 284 | OK ok; |
| 285 | OK ok2{ok}; |
| 286 | |
| 287 | struct X { |
| 288 | X() = default; |
| 289 | X(const X&) = default; |
| 290 | }; |
| 291 | |
| 292 | X x; |
| 293 | X x2{x}; |
| 294 | } // dr_example |
| 295 | |
| 296 | namespace nonaggregate { |
| 297 | struct NonAggregate { |
| 298 | NonAggregate() {} |
| 299 | }; |
| 300 | |
| 301 | struct WantsIt { |
| 302 | WantsIt(NonAggregate); |
| 303 | }; |
| 304 | |
| 305 | void f(NonAggregate); |
| 306 | void f(WantsIt); |
| 307 | |
| 308 | void test1() { |
| 309 | NonAggregate n; |
| 310 | f({n}); |
| 311 | } |
| 312 | |
| 313 | void test2() { |
| 314 | NonAggregate x; |
| 315 | NonAggregate y{x}; |
| 316 | NonAggregate z{{x}}; |
| 317 | } |
| 318 | } // nonaggregate |
| 319 | |
| 320 | namespace SelfInitIsNotListInit { |
| 321 | struct S { |
| 322 | S(); |
| 323 | explicit S(S &); |
| 324 | S(const S &); |
| 325 | }; |
| 326 | S s1; |
| 327 | S s2 = {s1}; // ok, not list-initialization so we pick the non-explicit constructor |
| 328 | } |
| 329 | |
| 330 | struct NestedInit { int a, b, c; }; |
| 331 | NestedInit ni[1] = {{NestedInit{1, 2, 3}}}; |
| 332 | |
| 333 | namespace NestedInit2 { |
| 334 | struct Pair { int a, b; }; |
| 335 | struct TwoPairs { TwoPairs(Pair, Pair); }; |
| 336 | struct Value { Value(Pair); Value(TwoPairs); }; |
| 337 | void f() { Value{{{1,2},{3,4}}}; } |
| 338 | } |
| 339 | } // dr1467 |
| 340 | |
| 341 | namespace dr1490 { // dr1490: 3.7 c++11 |
| 342 | // List-initialization from a string literal |
| 343 | |
| 344 | char s[4]{"abc"}; // Ok |
| 345 | std::initializer_list<char>{"abc"}; // expected-error {{expected unqualified-id}}} |
| 346 | } // dr190 |
| 347 | |
| 348 | namespace dr1495 { // dr1495: 4 |
| 349 | // Deduction succeeds in both directions. |
| 350 | template<typename T, typename U> struct A {}; // expected-note {{template is declared here}} |
| 351 | template<typename T, typename U> struct A<U, T> {}; // expected-error {{class template partial specialization is not more specialized}} |
| 352 | |
| 353 | // Primary template is more specialized. |
| 354 | template<typename, typename...> struct B {}; // expected-note {{template is declared here}} |
| 355 | template<typename ...Ts> struct B<Ts...> {}; // expected-error {{not more specialized}} |
| 356 | |
| 357 | // Deduction fails in both directions. |
| 358 | template<int, typename, typename ...> struct C {}; // expected-note {{template is declared here}} |
| 359 | template<typename ...Ts> struct C<0, Ts...> {}; // expected-error {{not more specialized}} |
| 360 | |
| 361 | #if __cplusplus >= 201402L |
| 362 | // Deduction succeeds in both directions. |
| 363 | template<typename T, typename U> int a; // expected-note {{template is declared here}} |
| 364 | template<typename T, typename U> int a<U, T>; // expected-error {{variable template partial specialization is not more specialized}} |
| 365 | |
| 366 | // Primary template is more specialized. |
| 367 | template<typename, typename...> int b; // expected-note {{template is declared here}} |
| 368 | template<typename ...Ts> int b<Ts...>; // expected-error {{not more specialized}} |
| 369 | |
| 370 | // Deduction fails in both directions. |
| 371 | template<int, typename, typename ...> int c; // expected-note {{template is declared here}} |
| 372 | template<typename ...Ts> int c<0, Ts...>; // expected-error {{not more specialized}} |
| 373 | #endif |
| 374 | } |
| 375 | #endif |
| 376 | |