| // RUN: %clang_cc1 -triple x86_64-linux-gnu -std=c++11 -emit-llvm -o - %s | FileCheck %s --check-prefix=CHECK-STATIC-BL | |
| // RUN: %clang_cc1 -triple x86_64-linux-gnu -std=c++11 -emit-llvm -o - %s -Dconstexpr= | FileCheck %s --check-prefix=CHECK-DYNAMIC-BL | |
| // RUN: %clang_cc1 -triple x86_64-linux-gnu -std=c++11 -emit-llvm -o - %s -DUSE_END | FileCheck %s --check-prefix=CHECK-STATIC-BE | |
| // RUN: %clang_cc1 -triple x86_64-linux-gnu -std=c++11 -emit-llvm -o - %s -DUSE_END -Dconstexpr= | FileCheck %s --check-prefix=CHECK-DYNAMIC-BE | |
| namespace std { | |
| typedef decltype(sizeof(int)) size_t; | |
| template <class _E> | |
| class initializer_list | |
| { | |
| const _E* __begin_; | |
| #ifdef USE_END | |
| const _E* __end_; | |
| #else | |
| size_t __size_; | |
| #endif | |
| constexpr initializer_list(const _E* __b, size_t __s) | |
| : __begin_(__b), | |
| #ifdef USE_END | |
| __end_(__b + __s) | |
| #else | |
| __size_(__s) | |
| #endif | |
| {} | |
| public: | |
| typedef _E value_type; | |
| typedef const _E& reference; | |
| typedef const _E& const_reference; | |
| typedef size_t size_type; | |
| typedef const _E* iterator; | |
| typedef const _E* const_iterator; | |
| #ifdef USE_END | |
| constexpr initializer_list() : __begin_(nullptr), __end_(nullptr) {} | |
| size_t size() const {return __end_ - __begin_;} | |
| const _E* begin() const {return __begin_;} | |
| const _E* end() const {return __end_;} | |
| #else | |
| constexpr initializer_list() : __begin_(nullptr), __size_(0) {} | |
| size_t size() const {return __size_;} | |
| const _E* begin() const {return __begin_;} | |
| const _E* end() const {return __begin_ + __size_;} | |
| #endif | |
| }; | |
| } | |
| constexpr int a = 2, b = 4, c = 6; | |
| std::initializer_list<std::initializer_list<int>> nested = { | |
| {1, a}, {3, b}, {5, c} | |
| }; | |
| // CHECK-STATIC-BL: @_ZGR6nested0_ = internal constant [2 x i32] [i32 1, i32 2], align 4 | |
| // CHECK-STATIC-BL: @_ZGR6nested1_ = internal constant [2 x i32] [i32 3, i32 4], align 4 | |
| // CHECK-STATIC-BL: @_ZGR6nested2_ = internal constant [2 x i32] [i32 5, i32 6], align 4 | |
| // CHECK-STATIC-BL: @_ZGR6nested_ = internal constant [3 x {{.*}}] [ | |
| // CHECK-STATIC-BL: {{.*}} { ptr @_ZGR6nested0_, i64 2 }, | |
| // CHECK-STATIC-BL: {{.*}} { ptr @_ZGR6nested1_, i64 2 }, | |
| // CHECK-STATIC-BL: {{.*}} { ptr @_ZGR6nested2_, i64 2 } | |
| // CHECK-STATIC-BL: ], align 8 | |
| // CHECK-STATIC-BL: @nested ={{.*}} global {{.*}} { {{.*}} @_ZGR6nested_, i64 3 }, align 8 | |
| // CHECK-DYNAMIC-BL: @nested ={{.*}} global | |
| // CHECK-DYNAMIC-BL: @_ZGR6nested_ = internal global [3 x | |
| // CHECK-DYNAMIC-BL: @_ZGR6nested0_ = internal global [2 x i32] zeroinitializer | |
| // CHECK-DYNAMIC-BL: @_ZGR6nested1_ = internal global [2 x i32] zeroinitializer | |
| // CHECK-DYNAMIC-BL: @_ZGR6nested2_ = internal global [2 x i32] zeroinitializer | |
| // CHECK-DYNAMIC-BL: store i32 1, ptr @_ZGR6nested0_ | |
| // CHECK-DYNAMIC-BL: store i32 {{.*}}, ptr getelementptr inbounds nuw (i8, ptr @_ZGR6nested0_, i64 4) | |
| // CHECK-DYNAMIC-BL: store ptr @_ZGR6nested0_, | |
| // CHECK-DYNAMIC-BL: ptr @_ZGR6nested_, align 8 | |
| // CHECK-DYNAMIC-BL: store i64 2, ptr getelementptr inbounds nuw (i8, ptr @_ZGR6nested_, i64 8), align 8 | |
| // CHECK-DYNAMIC-BL: store i32 3, ptr @_ZGR6nested1_ | |
| // CHECK-DYNAMIC-BL: store i32 {{.*}}, ptr getelementptr inbounds nuw (i8, ptr @_ZGR6nested1_, i64 4) | |
| // CHECK-DYNAMIC-BL: store ptr @_ZGR6nested1_, | |
| // CHECK-DYNAMIC-BL: ptr getelementptr inbounds nuw (i8, ptr @_ZGR6nested_, i64 16), align 8 | |
| // CHECK-DYNAMIC-BL: store i64 2, ptr getelementptr inbounds nuw (i8, ptr @_ZGR6nested_, i64 24), align 8 | |
| // CHECK-DYNAMIC-BL: store i32 5, ptr @_ZGR6nested2_ | |
| // CHECK-DYNAMIC-BL: store i32 {{.*}}, ptr getelementptr inbounds nuw (i8, ptr @_ZGR6nested2_, i64 4) | |
| // CHECK-DYNAMIC-BL: store ptr @_ZGR6nested2_, | |
| // CHECK-DYNAMIC-BL: ptr getelementptr inbounds nuw (i8, ptr @_ZGR6nested_, i64 32), align 8 | |
| // CHECK-DYNAMIC-BL: store i64 2, ptr getelementptr inbounds nuw (i8, ptr @_ZGR6nested_, i64 40), align 8 | |
| // CHECK-DYNAMIC-BL: store ptr @_ZGR6nested_, | |
| // CHECK-DYNAMIC-BL: ptr @nested, align 8 | |
| // CHECK-DYNAMIC-BL: store i64 3, ptr getelementptr inbounds nuw (i8, ptr @nested, i64 8), align 8 | |
| // CHECK-STATIC-BE: @_ZGR6nested0_ = internal constant [2 x i32] [i32 1, i32 2], align 4 | |
| // CHECK-STATIC-BE: @_ZGR6nested1_ = internal constant [2 x i32] [i32 3, i32 4], align 4 | |
| // CHECK-STATIC-BE: @_ZGR6nested2_ = internal constant [2 x i32] [i32 5, i32 6], align 4 | |
| // CHECK-STATIC-BE: @_ZGR6nested_ = internal constant [3 x {{.*}}] [ | |
| // CHECK-STATIC-BE: {{.*}} { ptr @_ZGR6nested0_, | |
| // CHECK-STATIC-BE: ptr getelementptr (i8, ptr @_ZGR6nested0_, i64 8) } | |
| // CHECK-STATIC-BE: {{.*}} { ptr @_ZGR6nested1_, | |
| // CHECK-STATIC-BE: ptr getelementptr (i8, ptr @_ZGR6nested1_, i64 8) } | |
| // CHECK-STATIC-BE: {{.*}} { ptr @_ZGR6nested2_, | |
| // CHECK-STATIC-BE: ptr getelementptr (i8, ptr @_ZGR6nested2_, i64 8) } | |
| // CHECK-STATIC-BE: ], align 8 | |
| // CHECK-STATIC-BE: @nested ={{.*}} global {{.*}} { ptr @_ZGR6nested_, | |
| // CHECK-STATIC-BE: {{.*}} getelementptr (i8, ptr @_ZGR6nested_, i64 48) } | |
| // CHECK-DYNAMIC-BE: @nested ={{.*}} global | |
| // CHECK-DYNAMIC-BE: @_ZGR6nested_ = internal global [3 x | |
| // CHECK-DYNAMIC-BE: @_ZGR6nested0_ = internal global [2 x i32] zeroinitializer | |
| // CHECK-DYNAMIC-BE: @_ZGR6nested1_ = internal global [2 x i32] zeroinitializer | |
| // CHECK-DYNAMIC-BE: @_ZGR6nested2_ = internal global [2 x i32] zeroinitializer | |
| // CHECK-DYNAMIC-BE: store i32 1, ptr @_ZGR6nested0_ | |
| // CHECK-DYNAMIC-BE: store i32 {{.*}}, ptr getelementptr inbounds nuw (i8, ptr @_ZGR6nested0_, i64 4) | |
| // CHECK-DYNAMIC-BE: store ptr @_ZGR6nested0_, | |
| // CHECK-DYNAMIC-BE: ptr @_ZGR6nested_, align 8 | |
| // CHECK-DYNAMIC-BE: store ptr getelementptr inbounds nuw (i8, ptr @_ZGR6nested0_, i64 8), | |
| // CHECK-DYNAMIC-BE: ptr getelementptr inbounds nuw (i8, ptr @_ZGR6nested_, i64 8), align 8 | |
| // CHECK-DYNAMIC-BE: store i32 3, ptr @_ZGR6nested1_ | |
| // CHECK-DYNAMIC-BE: store i32 {{.*}}, ptr getelementptr inbounds nuw (i8, ptr @_ZGR6nested1_, i64 4) | |
| // CHECK-DYNAMIC-BE: store ptr @_ZGR6nested1_, | |
| // CHECK-DYNAMIC-BE: ptr getelementptr inbounds nuw (i8, ptr @_ZGR6nested_, i64 16), align 8 | |
| // CHECK-DYNAMIC-BE: store ptr getelementptr inbounds nuw (i8, ptr @_ZGR6nested1_, i64 8), | |
| // CHECK-DYNAMIC-BE: ptr getelementptr inbounds nuw (i8, ptr @_ZGR6nested_, i64 24), align 8 | |
| // CHECK-DYNAMIC-BE: store i32 5, ptr @_ZGR6nested2_ | |
| // CHECK-DYNAMIC-BE: store i32 {{.*}}, ptr getelementptr inbounds nuw (i8, ptr @_ZGR6nested2_, i64 4) | |
| // CHECK-DYNAMIC-BE: store ptr @_ZGR6nested2_, | |
| // CHECK-DYNAMIC-BE: ptr getelementptr inbounds nuw (i8, ptr @_ZGR6nested_, i64 32), align 8 | |
| // CHECK-DYNAMIC-BE: store ptr getelementptr inbounds nuw (i8, ptr @_ZGR6nested2_, i64 8), | |
| // CHECK-DYNAMIC-BE: ptr getelementptr inbounds nuw (i8, ptr @_ZGR6nested_, i64 40), align 8 | |
| // CHECK-DYNAMIC-BE: store ptr @_ZGR6nested_, | |
| // CHECK-DYNAMIC-BE: ptr @nested, align 8 | |
| // CHECK-DYNAMIC-BE: store ptr getelementptr inbounds nuw (i8, ptr @_ZGR6nested_, i64 48), | |
| // CHECK-DYNAMIC-BE: ptr getelementptr inbounds nuw (i8, ptr @nested, i64 8), align 8 |