blob: ef7af88297af30937db0102ea044432a78a01420 [file] [log] [blame]
Sebastian Redl32cf1f22012-02-17 08:42:25 +00001// RUN: %clang_cc1 -std=c++11 -S -emit-llvm -o - %s | FileCheck %s
2
3namespace std {
4 typedef decltype(sizeof(int)) size_t;
5
6 // libc++'s implementation
7 template <class _E>
8 class initializer_list
9 {
10 const _E* __begin_;
11 size_t __size_;
12
13 initializer_list(const _E* __b, size_t __s)
14 : __begin_(__b),
15 __size_(__s)
16 {}
17
18 public:
19 typedef _E value_type;
20 typedef const _E& reference;
21 typedef const _E& const_reference;
22 typedef size_t size_type;
23
24 typedef const _E* iterator;
25 typedef const _E* const_iterator;
26
27 initializer_list() : __begin_(nullptr), __size_(0) {}
28
29 size_t size() const {return __size_;}
30 const _E* begin() const {return __begin_;}
31 const _E* end() const {return __begin_ + __size_;}
32 };
33}
34
35void fn1(int i) {
36 // CHECK: define void @_Z3fn1i
37 // temporary array
38 // CHECK: [[array:%[^ ]+]] = alloca [3 x i32]
39 // CHECK: getelementptr inbounds [3 x i32]* [[array]], i{{32|64}} 0
40 // CHECK-NEXT: store i32 1, i32*
41 // CHECK-NEXT: getelementptr
42 // CHECK-NEXT: store
43 // CHECK-NEXT: getelementptr
44 // CHECK-NEXT: load
45 // CHECK-NEXT: store
46 // init the list
47 // CHECK-NEXT: getelementptr
48 // CHECK-NEXT: getelementptr inbounds [3 x i32]*
49 // CHECK-NEXT: store i32*
50 // CHECK-NEXT: getelementptr
51 // CHECK-NEXT: store i{{32|64}} 3
52 std::initializer_list<int> intlist{1, 2, i};
53}
54
55struct destroyme1 {
56 ~destroyme1();
57};
58struct destroyme2 {
59 ~destroyme2();
60};
61
62
63void fn2() {
64 // CHECK: define void @_Z3fn2v
65 void target(std::initializer_list<destroyme1>);
66 // objects should be destroyed before dm2, after call returns
67 target({ destroyme1(), destroyme1() });
68 // CHECK: call void @_ZN10destroyme1D1Ev
69 destroyme2 dm2;
70 // CHECK: call void @_ZN10destroyme2D1Ev
71}
72
73void fn3() {
74 // CHECK: define void @_Z3fn3v
75 // objects should be destroyed after dm2
76 auto list = { destroyme1(), destroyme1() };
77 destroyme2 dm2;
78 // CHECK: call void @_ZN10destroyme2D1Ev
79 // CHECK: call void @_ZN10destroyme1D1Ev
80}