cxx0x-initializer-stdinitializerlist-startend.cpp 2.4 KB

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