1c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// RUN: %clang_cc1 -std=c++11 -triple x86_64-none-linux-gnu -emit-llvm -o - %s | FileCheck %s 232cf1f27ae8620e7b79bb4e81a067187c0aab7aeSebastian Redl 332cf1f27ae8620e7b79bb4e81a067187c0aab7aeSebastian Redlnamespace std { 432cf1f27ae8620e7b79bb4e81a067187c0aab7aeSebastian Redl typedef decltype(sizeof(int)) size_t; 532cf1f27ae8620e7b79bb4e81a067187c0aab7aeSebastian Redl 632cf1f27ae8620e7b79bb4e81a067187c0aab7aeSebastian Redl // libc++'s implementation 732cf1f27ae8620e7b79bb4e81a067187c0aab7aeSebastian Redl template <class _E> 832cf1f27ae8620e7b79bb4e81a067187c0aab7aeSebastian Redl class initializer_list 932cf1f27ae8620e7b79bb4e81a067187c0aab7aeSebastian Redl { 1032cf1f27ae8620e7b79bb4e81a067187c0aab7aeSebastian Redl const _E* __begin_; 1132cf1f27ae8620e7b79bb4e81a067187c0aab7aeSebastian Redl size_t __size_; 1232cf1f27ae8620e7b79bb4e81a067187c0aab7aeSebastian Redl 1332cf1f27ae8620e7b79bb4e81a067187c0aab7aeSebastian Redl initializer_list(const _E* __b, size_t __s) 1432cf1f27ae8620e7b79bb4e81a067187c0aab7aeSebastian Redl : __begin_(__b), 1532cf1f27ae8620e7b79bb4e81a067187c0aab7aeSebastian Redl __size_(__s) 1632cf1f27ae8620e7b79bb4e81a067187c0aab7aeSebastian Redl {} 1732cf1f27ae8620e7b79bb4e81a067187c0aab7aeSebastian Redl 1832cf1f27ae8620e7b79bb4e81a067187c0aab7aeSebastian Redl public: 1932cf1f27ae8620e7b79bb4e81a067187c0aab7aeSebastian Redl typedef _E value_type; 2032cf1f27ae8620e7b79bb4e81a067187c0aab7aeSebastian Redl typedef const _E& reference; 2132cf1f27ae8620e7b79bb4e81a067187c0aab7aeSebastian Redl typedef const _E& const_reference; 2232cf1f27ae8620e7b79bb4e81a067187c0aab7aeSebastian Redl typedef size_t size_type; 2332cf1f27ae8620e7b79bb4e81a067187c0aab7aeSebastian Redl 2432cf1f27ae8620e7b79bb4e81a067187c0aab7aeSebastian Redl typedef const _E* iterator; 2532cf1f27ae8620e7b79bb4e81a067187c0aab7aeSebastian Redl typedef const _E* const_iterator; 2632cf1f27ae8620e7b79bb4e81a067187c0aab7aeSebastian Redl 2732cf1f27ae8620e7b79bb4e81a067187c0aab7aeSebastian Redl initializer_list() : __begin_(nullptr), __size_(0) {} 2832cf1f27ae8620e7b79bb4e81a067187c0aab7aeSebastian Redl 2932cf1f27ae8620e7b79bb4e81a067187c0aab7aeSebastian Redl size_t size() const {return __size_;} 3032cf1f27ae8620e7b79bb4e81a067187c0aab7aeSebastian Redl const _E* begin() const {return __begin_;} 3132cf1f27ae8620e7b79bb4e81a067187c0aab7aeSebastian Redl const _E* end() const {return __begin_ + __size_;} 3232cf1f27ae8620e7b79bb4e81a067187c0aab7aeSebastian Redl }; 3332cf1f27ae8620e7b79bb4e81a067187c0aab7aeSebastian Redl} 3432cf1f27ae8620e7b79bb4e81a067187c0aab7aeSebastian Redl 3519b1a6eb2c90fab7cefe74bea5b6de490b65ac9dSebastian Redlstruct destroyme1 { 3619b1a6eb2c90fab7cefe74bea5b6de490b65ac9dSebastian Redl ~destroyme1(); 3719b1a6eb2c90fab7cefe74bea5b6de490b65ac9dSebastian Redl}; 3819b1a6eb2c90fab7cefe74bea5b6de490b65ac9dSebastian Redlstruct destroyme2 { 3919b1a6eb2c90fab7cefe74bea5b6de490b65ac9dSebastian Redl ~destroyme2(); 4019b1a6eb2c90fab7cefe74bea5b6de490b65ac9dSebastian Redl}; 4119b1a6eb2c90fab7cefe74bea5b6de490b65ac9dSebastian Redlstruct witharg1 { 4219b1a6eb2c90fab7cefe74bea5b6de490b65ac9dSebastian Redl witharg1(const destroyme1&); 4319b1a6eb2c90fab7cefe74bea5b6de490b65ac9dSebastian Redl ~witharg1(); 4419b1a6eb2c90fab7cefe74bea5b6de490b65ac9dSebastian Redl}; 4519b1a6eb2c90fab7cefe74bea5b6de490b65ac9dSebastian Redlstruct wantslist1 { 4619b1a6eb2c90fab7cefe74bea5b6de490b65ac9dSebastian Redl wantslist1(std::initializer_list<destroyme1>); 4719b1a6eb2c90fab7cefe74bea5b6de490b65ac9dSebastian Redl ~wantslist1(); 4819b1a6eb2c90fab7cefe74bea5b6de490b65ac9dSebastian Redl}; 4919b1a6eb2c90fab7cefe74bea5b6de490b65ac9dSebastian Redl 500e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// CHECK: @_ZGR15globalInitList1_ = internal constant [3 x i32] [i32 1, i32 2, i32 3] 513ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar// CHECK: @globalInitList1 = global %{{[^ ]+}} { i32* getelementptr inbounds ([3 x i32], [3 x i32]* @_ZGR15globalInitList1_, i32 0, i32 0), i{{32|64}} 3 } 5219b1a6eb2c90fab7cefe74bea5b6de490b65ac9dSebastian Redlstd::initializer_list<int> globalInitList1 = {1, 2, 3}; 5319b1a6eb2c90fab7cefe74bea5b6de490b65ac9dSebastian Redl 5404e517650569598e847c2ab609672e6df93effe5Richard Smithnamespace thread_local_global_array { 557c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith // FIXME: We should be able to constant-evaluate this even though the 567c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith // initializer is not a constant expression (pointers to thread_local 577c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith // objects aren't really a problem). 587c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith // 597c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith // CHECK: @_ZN25thread_local_global_array1xE = thread_local global 600e2c34f92f00628d48968dfea096d36381f494cbStephen Hines // CHECK: @_ZGRN25thread_local_global_array1xE_ = internal thread_local constant [4 x i32] [i32 1, i32 2, i32 3, i32 4] 6104e517650569598e847c2ab609672e6df93effe5Richard Smith std::initializer_list<int> thread_local x = { 1, 2, 3, 4 }; 6204e517650569598e847c2ab609672e6df93effe5Richard Smith} 6304e517650569598e847c2ab609672e6df93effe5Richard Smith 647c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith// CHECK: @globalInitList2 = global %{{[^ ]+}} zeroinitializer 650e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// CHECK: @_ZGR15globalInitList2_ = internal global [2 x %[[WITHARG:[^ ]*]]] zeroinitializer 663282b84296dba58e811741b63e4429980a98df8bRichard Smith 673282b84296dba58e811741b63e4429980a98df8bRichard Smith// CHECK: @_ZN15partly_constant1kE = global i32 0, align 4 683282b84296dba58e811741b63e4429980a98df8bRichard Smith// CHECK: @_ZN15partly_constant2ilE = global {{.*}} null, align 8 690e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// CHECK: @[[PARTLY_CONSTANT_OUTER:_ZGRN15partly_constant2ilE.*]] = internal global {{.*}} zeroinitializer, align 8 700e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// CHECK: @[[PARTLY_CONSTANT_INNER:_ZGRN15partly_constant2ilE.*]] = internal global [3 x {{.*}}] zeroinitializer, align 8 710e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// CHECK: @[[PARTLY_CONSTANT_FIRST:_ZGRN15partly_constant2ilE.*]] = internal constant [3 x i32] [i32 1, i32 2, i32 3], align 4 720e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// CHECK: @[[PARTLY_CONSTANT_SECOND:_ZGRN15partly_constant2ilE.*]] = internal global [2 x i32] zeroinitializer, align 4 730e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// CHECK: @[[PARTLY_CONSTANT_THIRD:_ZGRN15partly_constant2ilE.*]] = internal constant [4 x i32] [i32 5, i32 6, i32 7, i32 8], align 4 743282b84296dba58e811741b63e4429980a98df8bRichard Smith 753ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar// CHECK: @[[REFTMP1:.*]] = private constant [2 x i32] [i32 42, i32 43], align 4 763ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar// CHECK: @[[REFTMP2:.*]] = private constant [3 x %{{.*}}] [%{{.*}} { i32 1 }, %{{.*}} { i32 2 }, %{{.*}} { i32 3 }], align 4 773ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar 7819b1a6eb2c90fab7cefe74bea5b6de490b65ac9dSebastian Redl// CHECK: appending global 797c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith 807c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith 817c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith// thread_local initializer: 8293ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-LABEL: define internal void 833ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar// CHECK: store i32* getelementptr inbounds ([4 x i32], [4 x i32]* @_ZGRN25thread_local_global_array1xE_, i64 0, i64 0), 843ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar// CHECK: i32** getelementptr inbounds ({{.*}}, {{.*}}* @_ZN25thread_local_global_array1xE, i32 0, i32 0), align 8 853ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar// CHECK: store i64 4, i64* getelementptr inbounds ({{.*}}, {{.*}}* @_ZN25thread_local_global_array1xE, i32 0, i32 1), align 8 867c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith 877c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith 8893ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-LABEL: define internal void 893ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar// CHECK: call void @_ZN8witharg1C1ERK10destroyme1(%[[WITHARG]]* getelementptr inbounds ([2 x %[[WITHARG]]], [2 x %[[WITHARG]]]* @_ZGR15globalInitList2_, i{{32|64}} 0, i{{32|64}} 0 903ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar// CHECK: call void @_ZN8witharg1C1ERK10destroyme1(%[[WITHARG]]* getelementptr inbounds ([2 x %[[WITHARG]]], [2 x %[[WITHARG]]]* @_ZGR15globalInitList2_, i{{32|64}} 0, i{{32|64}} 1 9119b1a6eb2c90fab7cefe74bea5b6de490b65ac9dSebastian Redl// CHECK: __cxa_atexit 923ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar// CHECK: store %[[WITHARG]]* getelementptr inbounds ([2 x %[[WITHARG]]], [2 x %[[WITHARG]]]* @_ZGR15globalInitList2_, i64 0, i64 0), 933ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar// CHECK: %[[WITHARG]]** getelementptr inbounds (%{{.*}}, %{{.*}}* @globalInitList2, i32 0, i32 0), align 8 943ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar// CHECK: store i64 2, i64* getelementptr inbounds (%{{.*}}, %{{.*}}* @globalInitList2, i32 0, i32 1), align 8 9519b1a6eb2c90fab7cefe74bea5b6de490b65ac9dSebastian Redl// CHECK: call void @_ZN10destroyme1D1Ev 9619b1a6eb2c90fab7cefe74bea5b6de490b65ac9dSebastian Redl// CHECK: call void @_ZN10destroyme1D1Ev 9719b1a6eb2c90fab7cefe74bea5b6de490b65ac9dSebastian Redlstd::initializer_list<witharg1> globalInitList2 = { 9819b1a6eb2c90fab7cefe74bea5b6de490b65ac9dSebastian Redl witharg1(destroyme1()), witharg1(destroyme1()) 9919b1a6eb2c90fab7cefe74bea5b6de490b65ac9dSebastian Redl}; 10019b1a6eb2c90fab7cefe74bea5b6de490b65ac9dSebastian Redl 10132cf1f27ae8620e7b79bb4e81a067187c0aab7aeSebastian Redlvoid fn1(int i) { 10293ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin // CHECK-LABEL: define void @_Z3fn1i 10332cf1f27ae8620e7b79bb4e81a067187c0aab7aeSebastian Redl // temporary array 10432cf1f27ae8620e7b79bb4e81a067187c0aab7aeSebastian Redl // CHECK: [[array:%[^ ]+]] = alloca [3 x i32] 1053ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar // CHECK: getelementptr inbounds [3 x i32], [3 x i32]* [[array]], i{{32|64}} 0 10632cf1f27ae8620e7b79bb4e81a067187c0aab7aeSebastian Redl // CHECK-NEXT: store i32 1, i32* 10732cf1f27ae8620e7b79bb4e81a067187c0aab7aeSebastian Redl // CHECK-NEXT: getelementptr 10832cf1f27ae8620e7b79bb4e81a067187c0aab7aeSebastian Redl // CHECK-NEXT: store 10932cf1f27ae8620e7b79bb4e81a067187c0aab7aeSebastian Redl // CHECK-NEXT: getelementptr 11032cf1f27ae8620e7b79bb4e81a067187c0aab7aeSebastian Redl // CHECK-NEXT: load 11132cf1f27ae8620e7b79bb4e81a067187c0aab7aeSebastian Redl // CHECK-NEXT: store 11232cf1f27ae8620e7b79bb4e81a067187c0aab7aeSebastian Redl // init the list 11332cf1f27ae8620e7b79bb4e81a067187c0aab7aeSebastian Redl // CHECK-NEXT: getelementptr 1143ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar // CHECK-NEXT: getelementptr inbounds [3 x i32], [3 x i32]* 11532cf1f27ae8620e7b79bb4e81a067187c0aab7aeSebastian Redl // CHECK-NEXT: store i32* 11632cf1f27ae8620e7b79bb4e81a067187c0aab7aeSebastian Redl // CHECK-NEXT: getelementptr 11732cf1f27ae8620e7b79bb4e81a067187c0aab7aeSebastian Redl // CHECK-NEXT: store i{{32|64}} 3 11832cf1f27ae8620e7b79bb4e81a067187c0aab7aeSebastian Redl std::initializer_list<int> intlist{1, 2, i}; 11932cf1f27ae8620e7b79bb4e81a067187c0aab7aeSebastian Redl} 12032cf1f27ae8620e7b79bb4e81a067187c0aab7aeSebastian Redl 12132cf1f27ae8620e7b79bb4e81a067187c0aab7aeSebastian Redlvoid fn2() { 12293ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin // CHECK-LABEL: define void @_Z3fn2v 12332cf1f27ae8620e7b79bb4e81a067187c0aab7aeSebastian Redl void target(std::initializer_list<destroyme1>); 12432cf1f27ae8620e7b79bb4e81a067187c0aab7aeSebastian Redl // objects should be destroyed before dm2, after call returns 12525e640a6e11f455b9c12aa5f724f7d50d9174c9cSebastian Redl // CHECK: call void @_Z6targetSt16initializer_listI10destroyme1E 12632cf1f27ae8620e7b79bb4e81a067187c0aab7aeSebastian Redl target({ destroyme1(), destroyme1() }); 12732cf1f27ae8620e7b79bb4e81a067187c0aab7aeSebastian Redl // CHECK: call void @_ZN10destroyme1D1Ev 12832cf1f27ae8620e7b79bb4e81a067187c0aab7aeSebastian Redl destroyme2 dm2; 12932cf1f27ae8620e7b79bb4e81a067187c0aab7aeSebastian Redl // CHECK: call void @_ZN10destroyme2D1Ev 13032cf1f27ae8620e7b79bb4e81a067187c0aab7aeSebastian Redl} 13132cf1f27ae8620e7b79bb4e81a067187c0aab7aeSebastian Redl 13232cf1f27ae8620e7b79bb4e81a067187c0aab7aeSebastian Redlvoid fn3() { 13393ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin // CHECK-LABEL: define void @_Z3fn3v 13432cf1f27ae8620e7b79bb4e81a067187c0aab7aeSebastian Redl // objects should be destroyed after dm2 13532cf1f27ae8620e7b79bb4e81a067187c0aab7aeSebastian Redl auto list = { destroyme1(), destroyme1() }; 13632cf1f27ae8620e7b79bb4e81a067187c0aab7aeSebastian Redl destroyme2 dm2; 13732cf1f27ae8620e7b79bb4e81a067187c0aab7aeSebastian Redl // CHECK: call void @_ZN10destroyme2D1Ev 13832cf1f27ae8620e7b79bb4e81a067187c0aab7aeSebastian Redl // CHECK: call void @_ZN10destroyme1D1Ev 13932cf1f27ae8620e7b79bb4e81a067187c0aab7aeSebastian Redl} 14025e640a6e11f455b9c12aa5f724f7d50d9174c9cSebastian Redl 14125e640a6e11f455b9c12aa5f724f7d50d9174c9cSebastian Redlvoid fn4() { 14293ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin // CHECK-LABEL: define void @_Z3fn4v 14325e640a6e11f455b9c12aa5f724f7d50d9174c9cSebastian Redl void target(std::initializer_list<witharg1>); 14425e640a6e11f455b9c12aa5f724f7d50d9174c9cSebastian Redl // objects should be destroyed before dm2, after call returns 14525e640a6e11f455b9c12aa5f724f7d50d9174c9cSebastian Redl // CHECK: call void @_ZN8witharg1C1ERK10destroyme1 14625e640a6e11f455b9c12aa5f724f7d50d9174c9cSebastian Redl // CHECK: call void @_Z6targetSt16initializer_listI8witharg1E 14725e640a6e11f455b9c12aa5f724f7d50d9174c9cSebastian Redl target({ witharg1(destroyme1()), witharg1(destroyme1()) }); 14825e640a6e11f455b9c12aa5f724f7d50d9174c9cSebastian Redl // CHECK: call void @_ZN8witharg1D1Ev 14925e640a6e11f455b9c12aa5f724f7d50d9174c9cSebastian Redl // CHECK: call void @_ZN10destroyme1D1Ev 15025e640a6e11f455b9c12aa5f724f7d50d9174c9cSebastian Redl destroyme2 dm2; 15125e640a6e11f455b9c12aa5f724f7d50d9174c9cSebastian Redl // CHECK: call void @_ZN10destroyme2D1Ev 15225e640a6e11f455b9c12aa5f724f7d50d9174c9cSebastian Redl} 15325e640a6e11f455b9c12aa5f724f7d50d9174c9cSebastian Redl 15425e640a6e11f455b9c12aa5f724f7d50d9174c9cSebastian Redlvoid fn5() { 15593ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin // CHECK-LABEL: define void @_Z3fn5v 15625e640a6e11f455b9c12aa5f724f7d50d9174c9cSebastian Redl // temps should be destroyed before dm2 15725e640a6e11f455b9c12aa5f724f7d50d9174c9cSebastian Redl // objects should be destroyed after dm2 15825e640a6e11f455b9c12aa5f724f7d50d9174c9cSebastian Redl // CHECK: call void @_ZN8witharg1C1ERK10destroyme1 15925e640a6e11f455b9c12aa5f724f7d50d9174c9cSebastian Redl auto list = { witharg1(destroyme1()), witharg1(destroyme1()) }; 16025e640a6e11f455b9c12aa5f724f7d50d9174c9cSebastian Redl // CHECK: call void @_ZN10destroyme1D1Ev 16125e640a6e11f455b9c12aa5f724f7d50d9174c9cSebastian Redl destroyme2 dm2; 16225e640a6e11f455b9c12aa5f724f7d50d9174c9cSebastian Redl // CHECK: call void @_ZN10destroyme2D1Ev 16325e640a6e11f455b9c12aa5f724f7d50d9174c9cSebastian Redl // CHECK: call void @_ZN8witharg1D1Ev 16425e640a6e11f455b9c12aa5f724f7d50d9174c9cSebastian Redl} 165bac5cf4110c1c9ba0992fad4fd9f66cedc27f3daSebastian Redl 166bac5cf4110c1c9ba0992fad4fd9f66cedc27f3daSebastian Redlvoid fn6() { 16793ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin // CHECK-LABEL: define void @_Z3fn6v 168bac5cf4110c1c9ba0992fad4fd9f66cedc27f3daSebastian Redl void target(const wantslist1&); 169bac5cf4110c1c9ba0992fad4fd9f66cedc27f3daSebastian Redl // objects should be destroyed before dm2, after call returns 170bac5cf4110c1c9ba0992fad4fd9f66cedc27f3daSebastian Redl // CHECK: call void @_ZN10wantslist1C1ESt16initializer_listI10destroyme1E 171bac5cf4110c1c9ba0992fad4fd9f66cedc27f3daSebastian Redl // CHECK: call void @_Z6targetRK10wantslist1 172bac5cf4110c1c9ba0992fad4fd9f66cedc27f3daSebastian Redl target({ destroyme1(), destroyme1() }); 173bac5cf4110c1c9ba0992fad4fd9f66cedc27f3daSebastian Redl // CHECK: call void @_ZN10wantslist1D1Ev 174bac5cf4110c1c9ba0992fad4fd9f66cedc27f3daSebastian Redl // CHECK: call void @_ZN10destroyme1D1Ev 175bac5cf4110c1c9ba0992fad4fd9f66cedc27f3daSebastian Redl destroyme2 dm2; 176bac5cf4110c1c9ba0992fad4fd9f66cedc27f3daSebastian Redl // CHECK: call void @_ZN10destroyme2D1Ev 177bac5cf4110c1c9ba0992fad4fd9f66cedc27f3daSebastian Redl} 178bac5cf4110c1c9ba0992fad4fd9f66cedc27f3daSebastian Redl 179bac5cf4110c1c9ba0992fad4fd9f66cedc27f3daSebastian Redlvoid fn7() { 18093ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin // CHECK-LABEL: define void @_Z3fn7v 181bac5cf4110c1c9ba0992fad4fd9f66cedc27f3daSebastian Redl // temps should be destroyed before dm2 182bac5cf4110c1c9ba0992fad4fd9f66cedc27f3daSebastian Redl // object should be destroyed after dm2 183bac5cf4110c1c9ba0992fad4fd9f66cedc27f3daSebastian Redl // CHECK: call void @_ZN10wantslist1C1ESt16initializer_listI10destroyme1E 184bac5cf4110c1c9ba0992fad4fd9f66cedc27f3daSebastian Redl wantslist1 wl = { destroyme1(), destroyme1() }; 185bac5cf4110c1c9ba0992fad4fd9f66cedc27f3daSebastian Redl // CHECK: call void @_ZN10destroyme1D1Ev 186bac5cf4110c1c9ba0992fad4fd9f66cedc27f3daSebastian Redl destroyme2 dm2; 187bac5cf4110c1c9ba0992fad4fd9f66cedc27f3daSebastian Redl // CHECK: call void @_ZN10destroyme2D1Ev 188bac5cf4110c1c9ba0992fad4fd9f66cedc27f3daSebastian Redl // CHECK: call void @_ZN10wantslist1D1Ev 189bac5cf4110c1c9ba0992fad4fd9f66cedc27f3daSebastian Redl} 190af130fd78267ee9e2395b758a7d827b07ce317a0Sebastian Redl 191af130fd78267ee9e2395b758a7d827b07ce317a0Sebastian Redlvoid fn8() { 19293ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin // CHECK-LABEL: define void @_Z3fn8v 193af130fd78267ee9e2395b758a7d827b07ce317a0Sebastian Redl void target(std::initializer_list<std::initializer_list<destroyme1>>); 194af130fd78267ee9e2395b758a7d827b07ce317a0Sebastian Redl // objects should be destroyed before dm2, after call returns 195af130fd78267ee9e2395b758a7d827b07ce317a0Sebastian Redl // CHECK: call void @_Z6targetSt16initializer_listIS_I10destroyme1EE 196af130fd78267ee9e2395b758a7d827b07ce317a0Sebastian Redl std::initializer_list<destroyme1> inner; 197af130fd78267ee9e2395b758a7d827b07ce317a0Sebastian Redl target({ inner, { destroyme1() } }); 198af130fd78267ee9e2395b758a7d827b07ce317a0Sebastian Redl // CHECK: call void @_ZN10destroyme1D1Ev 199af130fd78267ee9e2395b758a7d827b07ce317a0Sebastian Redl // Only one destroy loop, since only one inner init list is directly inited. 200af130fd78267ee9e2395b758a7d827b07ce317a0Sebastian Redl // CHECK-NOT: call void @_ZN10destroyme1D1Ev 201af130fd78267ee9e2395b758a7d827b07ce317a0Sebastian Redl destroyme2 dm2; 202af130fd78267ee9e2395b758a7d827b07ce317a0Sebastian Redl // CHECK: call void @_ZN10destroyme2D1Ev 203af130fd78267ee9e2395b758a7d827b07ce317a0Sebastian Redl} 204af130fd78267ee9e2395b758a7d827b07ce317a0Sebastian Redl 205af130fd78267ee9e2395b758a7d827b07ce317a0Sebastian Redlvoid fn9() { 20693ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin // CHECK-LABEL: define void @_Z3fn9v 207af130fd78267ee9e2395b758a7d827b07ce317a0Sebastian Redl // objects should be destroyed after dm2 208af130fd78267ee9e2395b758a7d827b07ce317a0Sebastian Redl std::initializer_list<destroyme1> inner; 209af130fd78267ee9e2395b758a7d827b07ce317a0Sebastian Redl std::initializer_list<std::initializer_list<destroyme1>> list = 210af130fd78267ee9e2395b758a7d827b07ce317a0Sebastian Redl { inner, { destroyme1() } }; 211af130fd78267ee9e2395b758a7d827b07ce317a0Sebastian Redl destroyme2 dm2; 212af130fd78267ee9e2395b758a7d827b07ce317a0Sebastian Redl // CHECK: call void @_ZN10destroyme2D1Ev 213af130fd78267ee9e2395b758a7d827b07ce317a0Sebastian Redl // CHECK: call void @_ZN10destroyme1D1Ev 214af130fd78267ee9e2395b758a7d827b07ce317a0Sebastian Redl // Only one destroy loop, since only one inner init list is directly inited. 215af130fd78267ee9e2395b758a7d827b07ce317a0Sebastian Redl // CHECK-NOT: call void @_ZN10destroyme1D1Ev 216af130fd78267ee9e2395b758a7d827b07ce317a0Sebastian Redl // CHECK: ret void 217af130fd78267ee9e2395b758a7d827b07ce317a0Sebastian Redl} 218924db71fc8f6076c532c8c2ae93acc7f477452c8Sebastian Redl 219924db71fc8f6076c532c8c2ae93acc7f477452c8Sebastian Redlstruct haslist1 { 220924db71fc8f6076c532c8c2ae93acc7f477452c8Sebastian Redl std::initializer_list<int> il; 2213ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar haslist1(int i); 222924db71fc8f6076c532c8c2ae93acc7f477452c8Sebastian Redl}; 223924db71fc8f6076c532c8c2ae93acc7f477452c8Sebastian Redl 2243ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar// CHECK-LABEL: define void @_ZN8haslist1C2Ei 2253ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainarhaslist1::haslist1(int i) 226924db71fc8f6076c532c8c2ae93acc7f477452c8Sebastian Redl// CHECK: alloca [3 x i32] 2273ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar// CHECK: store i32 % 228924db71fc8f6076c532c8c2ae93acc7f477452c8Sebastian Redl// CHECK: store i32 2 229924db71fc8f6076c532c8c2ae93acc7f477452c8Sebastian Redl// CHECK: store i32 3 2303ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar : il{i, 2, 3} 231924db71fc8f6076c532c8c2ae93acc7f477452c8Sebastian Redl{ 232924db71fc8f6076c532c8c2ae93acc7f477452c8Sebastian Redl destroyme2 dm2; 233924db71fc8f6076c532c8c2ae93acc7f477452c8Sebastian Redl} 234924db71fc8f6076c532c8c2ae93acc7f477452c8Sebastian Redl 235924db71fc8f6076c532c8c2ae93acc7f477452c8Sebastian Redlstruct haslist2 { 236924db71fc8f6076c532c8c2ae93acc7f477452c8Sebastian Redl std::initializer_list<destroyme1> il; 237924db71fc8f6076c532c8c2ae93acc7f477452c8Sebastian Redl haslist2(); 238924db71fc8f6076c532c8c2ae93acc7f477452c8Sebastian Redl}; 239924db71fc8f6076c532c8c2ae93acc7f477452c8Sebastian Redl 24093ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-LABEL: define void @_ZN8haslist2C2Ev 241924db71fc8f6076c532c8c2ae93acc7f477452c8Sebastian Redlhaslist2::haslist2() 242924db71fc8f6076c532c8c2ae93acc7f477452c8Sebastian Redl : il{destroyme1(), destroyme1()} 243924db71fc8f6076c532c8c2ae93acc7f477452c8Sebastian Redl{ 244924db71fc8f6076c532c8c2ae93acc7f477452c8Sebastian Redl destroyme2 dm2; 245924db71fc8f6076c532c8c2ae93acc7f477452c8Sebastian Redl // CHECK: call void @_ZN10destroyme2D1Ev 246924db71fc8f6076c532c8c2ae93acc7f477452c8Sebastian Redl // CHECK: call void @_ZN10destroyme1D1Ev 247924db71fc8f6076c532c8c2ae93acc7f477452c8Sebastian Redl} 248972edf0534d8a50f87fac1d0ff34eb22f593df11Sebastian Redl 2493ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainarvoid fn10(int i) { 2503ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar // CHECK-LABEL: define void @_Z4fn10i 251972edf0534d8a50f87fac1d0ff34eb22f593df11Sebastian Redl // CHECK: alloca [3 x i32] 2524967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // CHECK: call i8* @_Znw{{[jm]}} 2533ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar // CHECK: store i32 % 254972edf0534d8a50f87fac1d0ff34eb22f593df11Sebastian Redl // CHECK: store i32 2 255972edf0534d8a50f87fac1d0ff34eb22f593df11Sebastian Redl // CHECK: store i32 3 256972edf0534d8a50f87fac1d0ff34eb22f593df11Sebastian Redl // CHECK: store i32* 2573ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar (void) new std::initializer_list<int> {i, 2, 3}; 258972edf0534d8a50f87fac1d0ff34eb22f593df11Sebastian Redl} 259972edf0534d8a50f87fac1d0ff34eb22f593df11Sebastian Redl 260972edf0534d8a50f87fac1d0ff34eb22f593df11Sebastian Redlvoid fn11() { 26193ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin // CHECK-LABEL: define void @_Z4fn11v 262972edf0534d8a50f87fac1d0ff34eb22f593df11Sebastian Redl (void) new std::initializer_list<destroyme1> {destroyme1(), destroyme1()}; 263972edf0534d8a50f87fac1d0ff34eb22f593df11Sebastian Redl // CHECK: call void @_ZN10destroyme1D1Ev 264972edf0534d8a50f87fac1d0ff34eb22f593df11Sebastian Redl destroyme2 dm2; 265972edf0534d8a50f87fac1d0ff34eb22f593df11Sebastian Redl // CHECK: call void @_ZN10destroyme2D1Ev 266972edf0534d8a50f87fac1d0ff34eb22f593df11Sebastian Redl} 2672835745a451002798fed9800aeb19277f6a8fcb3Sebastian Redl 2682835745a451002798fed9800aeb19277f6a8fcb3Sebastian Redlnamespace PR12178 { 2692835745a451002798fed9800aeb19277f6a8fcb3Sebastian Redl struct string { 2702835745a451002798fed9800aeb19277f6a8fcb3Sebastian Redl string(int); 2712835745a451002798fed9800aeb19277f6a8fcb3Sebastian Redl ~string(); 2722835745a451002798fed9800aeb19277f6a8fcb3Sebastian Redl }; 2732835745a451002798fed9800aeb19277f6a8fcb3Sebastian Redl 2742835745a451002798fed9800aeb19277f6a8fcb3Sebastian Redl struct pair { 2752835745a451002798fed9800aeb19277f6a8fcb3Sebastian Redl string a; 2762835745a451002798fed9800aeb19277f6a8fcb3Sebastian Redl int b; 2772835745a451002798fed9800aeb19277f6a8fcb3Sebastian Redl }; 2782835745a451002798fed9800aeb19277f6a8fcb3Sebastian Redl 2792835745a451002798fed9800aeb19277f6a8fcb3Sebastian Redl struct map { 2802835745a451002798fed9800aeb19277f6a8fcb3Sebastian Redl map(std::initializer_list<pair>); 2812835745a451002798fed9800aeb19277f6a8fcb3Sebastian Redl }; 2822835745a451002798fed9800aeb19277f6a8fcb3Sebastian Redl 2832835745a451002798fed9800aeb19277f6a8fcb3Sebastian Redl map m{ {1, 2}, {3, 4} }; 2842835745a451002798fed9800aeb19277f6a8fcb3Sebastian Redl} 28529a11f45849aa87959e780abb0014a1876e0b39eDouglas Gregor 28629a11f45849aa87959e780abb0014a1876e0b39eDouglas Gregornamespace rdar13325066 { 28729a11f45849aa87959e780abb0014a1876e0b39eDouglas Gregor struct X { ~X(); }; 28829a11f45849aa87959e780abb0014a1876e0b39eDouglas Gregor 28993ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin // CHECK-LABEL: define void @_ZN12rdar133250664loopERNS_1XES1_ 29029a11f45849aa87959e780abb0014a1876e0b39eDouglas Gregor void loop(X &x1, X &x2) { 29129a11f45849aa87959e780abb0014a1876e0b39eDouglas Gregor // CHECK: br label 29229a11f45849aa87959e780abb0014a1876e0b39eDouglas Gregor // CHECK: br i1 29329a11f45849aa87959e780abb0014a1876e0b39eDouglas Gregor // CHECK: br label 2943ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar // CHECK: call void @_ZN12rdar133250661XD1Ev 29529a11f45849aa87959e780abb0014a1876e0b39eDouglas Gregor // CHECK: br label 29629a11f45849aa87959e780abb0014a1876e0b39eDouglas Gregor // CHECK: br label 29729a11f45849aa87959e780abb0014a1876e0b39eDouglas Gregor // CHECK: call void @_ZN12rdar133250661XD1Ev 29829a11f45849aa87959e780abb0014a1876e0b39eDouglas Gregor // CHECK: br i1 29929a11f45849aa87959e780abb0014a1876e0b39eDouglas Gregor // CHECK: br label 30029a11f45849aa87959e780abb0014a1876e0b39eDouglas Gregor // CHECK: ret void 30129a11f45849aa87959e780abb0014a1876e0b39eDouglas Gregor for (X x : { x1, x2 }) { } 30229a11f45849aa87959e780abb0014a1876e0b39eDouglas Gregor } 30329a11f45849aa87959e780abb0014a1876e0b39eDouglas Gregor} 304e69fb2043519d8f36314dd5dd78bb7638c6140f6Richard Smith 305e69fb2043519d8f36314dd5dd78bb7638c6140f6Richard Smithnamespace dtors { 306e69fb2043519d8f36314dd5dd78bb7638c6140f6Richard Smith struct S { 307e69fb2043519d8f36314dd5dd78bb7638c6140f6Richard Smith S(); 308e69fb2043519d8f36314dd5dd78bb7638c6140f6Richard Smith ~S(); 309e69fb2043519d8f36314dd5dd78bb7638c6140f6Richard Smith }; 3107c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith void z(); 3117c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith 31293ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin // CHECK-LABEL: define void @_ZN5dtors1fEv( 313e69fb2043519d8f36314dd5dd78bb7638c6140f6Richard Smith void f() { 3147b7db26d78509c0692d0000bbed1b0cf5e18ece8Richard Smith // CHECK: call void @_ZN5dtors1SC1Ev( 3157b7db26d78509c0692d0000bbed1b0cf5e18ece8Richard Smith // CHECK: call void @_ZN5dtors1SC1Ev( 316e69fb2043519d8f36314dd5dd78bb7638c6140f6Richard Smith std::initializer_list<S>{ S(), S() }; 3177c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith 3187c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith // Destruction loop for underlying array. 3197c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith // CHECK: br label 3207c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith // CHECK: call void @_ZN5dtors1SD1Ev( 3217c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith // CHECK: br i1 3227c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith 3237c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith // CHECK: call void @_ZN5dtors1zEv( 3247c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith z(); 3257c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith 3267c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith // CHECK-NOT: call void @_ZN5dtors1SD1Ev( 327e69fb2043519d8f36314dd5dd78bb7638c6140f6Richard Smith } 3287c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith 32993ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin // CHECK-LABEL: define void @_ZN5dtors1gEv( 330211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith void g() { 3317b7db26d78509c0692d0000bbed1b0cf5e18ece8Richard Smith // CHECK: call void @_ZN5dtors1SC1Ev( 3327b7db26d78509c0692d0000bbed1b0cf5e18ece8Richard Smith // CHECK: call void @_ZN5dtors1SC1Ev( 333211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith auto x = std::initializer_list<S>{ S(), S() }; 3347c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith 3357c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith // Destruction loop for underlying array. 3367c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith // CHECK: br label 3377c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith // CHECK: call void @_ZN5dtors1SD1Ev( 3387c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith // CHECK: br i1 3397c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith 3407c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith // CHECK: call void @_ZN5dtors1zEv( 3417c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith z(); 3427c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith 3437c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith // CHECK-NOT: call void @_ZN5dtors1SD1Ev( 3447c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith } 3457c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith 34693ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin // CHECK-LABEL: define void @_ZN5dtors1hEv( 3477c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith void h() { 3487b7db26d78509c0692d0000bbed1b0cf5e18ece8Richard Smith // CHECK: call void @_ZN5dtors1SC1Ev( 3497b7db26d78509c0692d0000bbed1b0cf5e18ece8Richard Smith // CHECK: call void @_ZN5dtors1SC1Ev( 3507c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith std::initializer_list<S> x = { S(), S() }; 3517c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith 3527c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith // CHECK-NOT: call void @_ZN5dtors1SD1Ev( 3537c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith 3547c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith // CHECK: call void @_ZN5dtors1zEv( 3557c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith z(); 3567c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith 3577c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith // Destruction loop for underlying array. 3587c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith // CHECK: br label 3597c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith // CHECK: call void @_ZN5dtors1SD1Ev( 3607c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith // CHECK: br i1 361211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith } 362e69fb2043519d8f36314dd5dd78bb7638c6140f6Richard Smith} 3633282b84296dba58e811741b63e4429980a98df8bRichard Smith 3643282b84296dba58e811741b63e4429980a98df8bRichard Smithnamespace partly_constant { 3653282b84296dba58e811741b63e4429980a98df8bRichard Smith int k; 3663282b84296dba58e811741b63e4429980a98df8bRichard Smith std::initializer_list<std::initializer_list<int>> &&il = { { 1, 2, 3 }, { 4, k }, { 5, 6, 7, 8 } }; 3673282b84296dba58e811741b63e4429980a98df8bRichard Smith // First init list. 3683282b84296dba58e811741b63e4429980a98df8bRichard Smith // CHECK-NOT: @[[PARTLY_CONSTANT_FIRST]], 3693ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar // CHECK: store i32* getelementptr inbounds ({{.*}}, {{.*}}* @[[PARTLY_CONSTANT_FIRST]], i64 0, i64 0), 3703ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar // CHECK: i32** getelementptr inbounds ({{.*}}, {{.*}}* @[[PARTLY_CONSTANT_INNER]], i64 0, i64 0, i32 0) 3713ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar // CHECK: store i64 3, i64* getelementptr inbounds ({{.*}}, {{.*}}* @[[PARTLY_CONSTANT_INNER]], i64 0, i64 0, i32 1) 3723282b84296dba58e811741b63e4429980a98df8bRichard Smith // CHECK-NOT: @[[PARTLY_CONSTANT_FIRST]], 3733282b84296dba58e811741b63e4429980a98df8bRichard Smith // 3743282b84296dba58e811741b63e4429980a98df8bRichard Smith // Second init list array (non-constant). 3753ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar // CHECK: store i32 4, i32* getelementptr inbounds ({{.*}}, {{.*}}* @[[PARTLY_CONSTANT_SECOND]], i64 0, i64 0) 3763ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar // CHECK: load i32, i32* @_ZN15partly_constant1kE 3773ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar // CHECK: store i32 {{.*}}, i32* getelementptr inbounds ({{.*}}, {{.*}}* @[[PARTLY_CONSTANT_SECOND]], i64 0, i64 1) 3783282b84296dba58e811741b63e4429980a98df8bRichard Smith // 3793282b84296dba58e811741b63e4429980a98df8bRichard Smith // Second init list. 3803ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar // CHECK: store i32* getelementptr inbounds ({{.*}}, {{.*}}* @[[PARTLY_CONSTANT_SECOND]], i64 0, i64 0), 3813ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar // CHECK: i32** getelementptr inbounds ({{.*}}, {{.*}}* @[[PARTLY_CONSTANT_INNER]], i64 0, i64 1, i32 0) 3823ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar // CHECK: store i64 2, i64* getelementptr inbounds ({{.*}}, {{.*}}* @[[PARTLY_CONSTANT_INNER]], i64 0, i64 1, i32 1) 3833282b84296dba58e811741b63e4429980a98df8bRichard Smith // 3843282b84296dba58e811741b63e4429980a98df8bRichard Smith // Third init list. 3853282b84296dba58e811741b63e4429980a98df8bRichard Smith // CHECK-NOT: @[[PARTLY_CONSTANT_THIRD]], 3863ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar // CHECK: store i32* getelementptr inbounds ({{.*}}, {{.*}}* @[[PARTLY_CONSTANT_THIRD]], i64 0, i64 0), 3873ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar // CHECK: i32** getelementptr inbounds ({{.*}}, {{.*}}* @[[PARTLY_CONSTANT_INNER]], i64 0, i64 2, i32 0) 3883ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar // CHECK: store i64 4, i64* getelementptr inbounds ({{.*}}, {{.*}}* @_ZGRN15partly_constant2ilE4_, i64 0, i64 2, i32 1) 3893282b84296dba58e811741b63e4429980a98df8bRichard Smith // CHECK-NOT: @[[PARTLY_CONSTANT_THIRD]], 3903282b84296dba58e811741b63e4429980a98df8bRichard Smith // 3913282b84296dba58e811741b63e4429980a98df8bRichard Smith // Outer init list. 3923ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar // CHECK: store {{.*}}* getelementptr inbounds ({{.*}}, {{.*}}* @[[PARTLY_CONSTANT_INNER]], i64 0, i64 0), 3933ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar // CHECK: {{.*}}** getelementptr inbounds ({{.*}}, {{.*}}* @[[PARTLY_CONSTANT_OUTER]], i32 0, i32 0) 3943ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar // CHECK: store i64 3, i64* getelementptr inbounds ({{.*}}, {{.*}}* @[[PARTLY_CONSTANT_OUTER]], i32 0, i32 1) 3953282b84296dba58e811741b63e4429980a98df8bRichard Smith // 3963282b84296dba58e811741b63e4429980a98df8bRichard Smith // 'il' reference. 3973282b84296dba58e811741b63e4429980a98df8bRichard Smith // CHECK: store {{.*}}* @[[PARTLY_CONSTANT_OUTER]], {{.*}}** @_ZN15partly_constant2ilE, align 8 3983282b84296dba58e811741b63e4429980a98df8bRichard Smith} 3995771aab8027e317de1e3f2f67b5dae67b3d895f8Richard Smith 4005771aab8027e317de1e3f2f67b5dae67b3d895f8Richard Smithnamespace nested { 4015771aab8027e317de1e3f2f67b5dae67b3d895f8Richard Smith struct A { A(); ~A(); }; 4025771aab8027e317de1e3f2f67b5dae67b3d895f8Richard Smith struct B { const A &a; ~B(); }; 4035771aab8027e317de1e3f2f67b5dae67b3d895f8Richard Smith struct C { std::initializer_list<B> b; ~C(); }; 4045771aab8027e317de1e3f2f67b5dae67b3d895f8Richard Smith void f(); 40593ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin // CHECK-LABEL: define void @_ZN6nested1gEv( 4065771aab8027e317de1e3f2f67b5dae67b3d895f8Richard Smith void g() { 4075771aab8027e317de1e3f2f67b5dae67b3d895f8Richard Smith // CHECK: call void @_ZN6nested1AC1Ev( 4085771aab8027e317de1e3f2f67b5dae67b3d895f8Richard Smith // CHECK-NOT: call 4095771aab8027e317de1e3f2f67b5dae67b3d895f8Richard Smith // CHECK: call void @_ZN6nested1AC1Ev( 4105771aab8027e317de1e3f2f67b5dae67b3d895f8Richard Smith // CHECK-NOT: call 4115771aab8027e317de1e3f2f67b5dae67b3d895f8Richard Smith const C &c { { { A() }, { A() } } }; 4125771aab8027e317de1e3f2f67b5dae67b3d895f8Richard Smith 4135771aab8027e317de1e3f2f67b5dae67b3d895f8Richard Smith // CHECK: call void @_ZN6nested1fEv( 4145771aab8027e317de1e3f2f67b5dae67b3d895f8Richard Smith // CHECK-NOT: call 4155771aab8027e317de1e3f2f67b5dae67b3d895f8Richard Smith f(); 4165771aab8027e317de1e3f2f67b5dae67b3d895f8Richard Smith 4175771aab8027e317de1e3f2f67b5dae67b3d895f8Richard Smith // CHECK: call void @_ZN6nested1CD1Ev( 4185771aab8027e317de1e3f2f67b5dae67b3d895f8Richard Smith // CHECK-NOT: call 4195771aab8027e317de1e3f2f67b5dae67b3d895f8Richard Smith 4205771aab8027e317de1e3f2f67b5dae67b3d895f8Richard Smith // Destroy B[2] array. 4215771aab8027e317de1e3f2f67b5dae67b3d895f8Richard Smith // FIXME: This isn't technically correct: reverse construction order would 4225771aab8027e317de1e3f2f67b5dae67b3d895f8Richard Smith // destroy the second B then the second A then the first B then the first A. 4235771aab8027e317de1e3f2f67b5dae67b3d895f8Richard Smith // CHECK: call void @_ZN6nested1BD1Ev( 4245771aab8027e317de1e3f2f67b5dae67b3d895f8Richard Smith // CHECK-NOT: call 4255771aab8027e317de1e3f2f67b5dae67b3d895f8Richard Smith // CHECK: br 4265771aab8027e317de1e3f2f67b5dae67b3d895f8Richard Smith 4275771aab8027e317de1e3f2f67b5dae67b3d895f8Richard Smith // CHECK-NOT: call 4285771aab8027e317de1e3f2f67b5dae67b3d895f8Richard Smith // CHECK: call void @_ZN6nested1AD1Ev( 4295771aab8027e317de1e3f2f67b5dae67b3d895f8Richard Smith // CHECK-NOT: call 4305771aab8027e317de1e3f2f67b5dae67b3d895f8Richard Smith // CHECK: call void @_ZN6nested1AD1Ev( 4315771aab8027e317de1e3f2f67b5dae67b3d895f8Richard Smith // CHECK-NOT: call 4325771aab8027e317de1e3f2f67b5dae67b3d895f8Richard Smith // CHECK: } 4335771aab8027e317de1e3f2f67b5dae67b3d895f8Richard Smith } 4345771aab8027e317de1e3f2f67b5dae67b3d895f8Richard Smith} 435c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines 436c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinesnamespace DR1070 { 437c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines struct A { 438c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines A(std::initializer_list<int>); 439c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines }; 440c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines struct B { 441c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines int i; 442c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines A a; 443c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines }; 444c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines B b = {1}; 445c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines struct C { 446c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines std::initializer_list<int> a; 447c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines B b; 448c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines std::initializer_list<double> c; 449c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines }; 450c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines C c = {}; 451c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines} 452c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines 453c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinesnamespace ArrayOfInitList { 454c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines struct S { 455c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines S(std::initializer_list<int>); 456c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines }; 457c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines S x[1] = {}; 458c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines} 459176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 460176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesnamespace PR20445 { 461176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines struct vector { vector(std::initializer_list<int>); }; 462176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines struct MyClass { explicit MyClass(const vector &v); }; 463176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines template<int x> void f() { new MyClass({42, 43}); } 464176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines template void f<0>(); 465176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // CHECK-LABEL: define {{.*}} @_ZN7PR204451fILi0EEEvv( 4663ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar // CHECK: store i32* getelementptr inbounds ([2 x i32], [2 x i32]* @[[REFTMP1]], i64 0, i64 0) 467176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // CHECK: call void @_ZN7PR204456vectorC1ESt16initializer_listIiE( 468176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // CHECK: call void @_ZN7PR204457MyClassC1ERKNS_6vectorE( 469176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines} 4703ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar 4713ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainarnamespace ConstExpr { 4723ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar class C { 4733ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar int x; 4743ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar public: 4753ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar constexpr C(int x) : x(x) {} 4763ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar }; 4773ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar void f(std::initializer_list<C>); 4783ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar void g() { 4793ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar// CHECK-LABEL: _ZN9ConstExpr1gEv 4803ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar// CHECK: store %"class.ConstExpr::C"* getelementptr inbounds ([3 x %"class.ConstExpr::C"], [3 x %"class.ConstExpr::C"]* @[[REFTMP2]], i64 0, i64 0) 4813ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar// CHECK: call void @_ZN9ConstExpr1fESt16initializer_listINS_1CEE 4823ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar f({C(1), C(2), C(3)}); 4833ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar } 4843ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar} 4853ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar 4863ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainarnamespace B19773010 { 4873ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar template <class T1, class T2> struct pair { 4883ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar T1 first; 4893ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar T2 second; 4903ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar constexpr pair() : first(), second() {} 4913ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar constexpr pair(T1 a, T2 b) : first(a), second(b) {} 4923ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar }; 4933ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar 4943ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar enum E { ENUM_CONSTANT }; 4953ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar struct testcase { 4963ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar testcase(std::initializer_list<pair<const char *, E>>); 4973ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar }; 4983ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar void f1() { 4993ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar // CHECK-LABEL: @_ZN9B197730102f1Ev 5003ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar testcase a{{"", ENUM_CONSTANT}}; 5013ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar // CHECK: store %"struct.B19773010::pair"* getelementptr inbounds ([1 x %"struct.B19773010::pair"], [1 x %"struct.B19773010::pair"]* bitcast ([1 x { i8*, i32 }]* @.ref.tmp{{.*}} to [1 x %"struct.B19773010::pair"]*), i64 0, i64 0), %"struct.B19773010::pair"** %{{.*}}, align 8 5023ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar } 5033ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar void f2() { 5043ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar // CHECK-LABEL: @_ZN9B197730102f2Ev 50587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // CHECK: store %"struct.B19773010::pair"* getelementptr inbounds ([1 x %"struct.B19773010::pair"], [1 x %"struct.B19773010::pair"]* bitcast ([1 x { i8*, i32 }]* @_ZGRZN9B197730102f2EvE1p_ to [1 x %"struct.B19773010::pair"]*), i64 0, i64 0), %"struct.B19773010::pair"** getelementptr inbounds ([2 x %"class.std::initializer_list.10"], [2 x %"class.std::initializer_list.10"]* @_ZZN9B197730102f2EvE1p, i64 0, i64 1, i32 0), align 16 5063ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar static std::initializer_list<pair<const char *, E>> a, p[2] = 5073ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar {a, {{"", ENUM_CONSTANT}}}; 5083ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar } 5093ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar 5103ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar void PR22940_helper(const pair<void*, int>&) { } 5113ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar void PR22940() { 5123ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar // CHECK-LABEL: @_ZN9B197730107PR22940Ev 51358878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar // CHECK: call {{.*}} @_ZN9B197730104pairIPviEC{{.}}Ev( 5143ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar // CHECK: call {{.*}} @_ZN9B1977301014PR22940_helperERKNS_4pairIPviEE( 5153ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar PR22940_helper(pair<void*, int>()); 5163ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar } 5173ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar} 518