xref: /llvm-project/clang/test/AST/ByteCode/initializer_list.cpp (revision 35f7cfb22420a7c94b48e54fa28195ada9863d1a)
1 // RUN: %clang_cc1 -fexperimental-new-constant-interpreter -fms-extensions -std=c++20 -verify=expected,both %s
2 // RUN: %clang_cc1 -std=c++20 -fms-extensions -verify=ref,both %s
3 
4 namespace std {
5   typedef decltype(sizeof(int)) size_t;
6   template <class _E>
7   class initializer_list
8   {
9     const _E* __begin_;
10     size_t    __size_;
11 
12     initializer_list(const _E* __b, size_t __s)
13       : __begin_(__b),
14         __size_(__s)
15     {}
16 
17   public:
18     typedef _E        value_type;
19     typedef const _E& reference;
20     typedef const _E& const_reference;
21     typedef size_t    size_type;
22 
23     typedef const _E* iterator;
24     typedef const _E* const_iterator;
25 
26     constexpr initializer_list() : __begin_(nullptr), __size_(0) {}
27 
28     constexpr size_t    size()  const {return __size_;}
29     constexpr const _E* begin() const {return __begin_;}
30     constexpr const _E* end()   const {return __begin_ + __size_;}
31   };
32 }
33 
34 class Thing {
35 public:
36   int m = 12;
37   constexpr Thing(int m) : m(m) {}
38   constexpr bool operator==(const Thing& that) const {
39     return this->m == that.m;
40   }
41 };
42 
43 constexpr bool is_contained(std::initializer_list<Thing> Set, const Thing &Element) {
44    return (*Set.begin() == Element);
45 }
46 
47 constexpr int foo() {
48   const Thing a{12};
49   const Thing b{14};
50   return is_contained({a}, b);
51 }
52 
53 static_assert(foo() == 0);
54 
55 
56 namespace rdar13395022 {
57   struct MoveOnly { // both-note {{candidate}}
58     MoveOnly(MoveOnly&&); // both-note 2{{copy constructor is implicitly deleted because}} both-note {{candidate}}
59   };
60 
61   void test(MoveOnly mo) {
62     auto &&list1 = {mo}; // both-error {{call to implicitly-deleted copy constructor}} both-note {{in initialization of temporary of type 'std::initializer_list}}
63     MoveOnly (&&list2)[1] = {mo}; // both-error {{call to implicitly-deleted copy constructor}} both-note {{in initialization of temporary of type 'MoveOnly[1]'}}
64     std::initializer_list<MoveOnly> &&list3 = {};
65     MoveOnly (&&list4)[1] = {}; // both-error {{no matching constructor}}
66     // both-note@-1 {{in implicit initialization of array element 0 with omitted initializer}}
67     // both-note@-2 {{in initialization of temporary of type 'MoveOnly[1]' created to list-initialize this reference}}
68   }
69 }
70 
71 
72