1ef8225444452a1486bd721f3285301fe84643b00Stephen 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 506bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// CHECK: @_ZGR15globalInitList1_ = private constant [3 x i32] [i32 1, i32 2, i32 3] 516bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// CHECK: @globalInitList1 = global %{{[^ ]+}} { i32* getelementptr inbounds ([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 606bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // CHECK: @_ZGRN25thread_local_global_array1xE_ = private 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 656bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// CHECK: @_ZGR15globalInitList2_ = private 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 693282b84296dba58e811741b63e4429980a98df8bRichard Smith// CHECK: @[[PARTLY_CONSTANT_OUTER:_ZGRN15partly_constant2ilE.*]] = private global {{.*}} zeroinitializer, align 8 703282b84296dba58e811741b63e4429980a98df8bRichard Smith// CHECK: @[[PARTLY_CONSTANT_INNER:_ZGRN15partly_constant2ilE.*]] = private global [3 x {{.*}}] zeroinitializer, align 8 713282b84296dba58e811741b63e4429980a98df8bRichard Smith// CHECK: @[[PARTLY_CONSTANT_FIRST:_ZGRN15partly_constant2ilE.*]] = private constant [3 x i32] [i32 1, i32 2, i32 3], align 4 723282b84296dba58e811741b63e4429980a98df8bRichard Smith// CHECK: @[[PARTLY_CONSTANT_SECOND:_ZGRN15partly_constant2ilE.*]] = private global [2 x i32] zeroinitializer, align 4 733282b84296dba58e811741b63e4429980a98df8bRichard Smith// CHECK: @[[PARTLY_CONSTANT_THIRD:_ZGRN15partly_constant2ilE.*]] = private constant [4 x i32] [i32 5, i32 6, i32 7, i32 8], align 4 743282b84296dba58e811741b63e4429980a98df8bRichard Smith 7519b1a6eb2c90fab7cefe74bea5b6de490b65ac9dSebastian Redl// CHECK: appending global 767c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith 777c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith 787c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith// thread_local initializer: 7993ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-LABEL: define internal void 806bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// CHECK: store i32* getelementptr inbounds ([4 x i32]* @_ZGRN25thread_local_global_array1xE_, i64 0, i64 0), 817c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith// CHECK: i32** getelementptr inbounds ({{.*}}* @_ZN25thread_local_global_array1xE, i32 0, i32 0), align 8 827c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith// CHECK: store i64 4, i64* getelementptr inbounds ({{.*}}* @_ZN25thread_local_global_array1xE, i32 0, i32 1), align 8 837c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith 847c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith 8593ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-LABEL: define internal void 866bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// CHECK: call void @_ZN8witharg1C1ERK10destroyme1(%[[WITHARG]]* getelementptr inbounds ([2 x %[[WITHARG]]]* @_ZGR15globalInitList2_, i{{32|64}} 0, i{{32|64}} 0 876bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// CHECK: call void @_ZN8witharg1C1ERK10destroyme1(%[[WITHARG]]* getelementptr inbounds ([2 x %[[WITHARG]]]* @_ZGR15globalInitList2_, i{{32|64}} 0, i{{32|64}} 1 8819b1a6eb2c90fab7cefe74bea5b6de490b65ac9dSebastian Redl// CHECK: __cxa_atexit 896bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// CHECK: store %[[WITHARG]]* getelementptr inbounds ([2 x %[[WITHARG]]]* @_ZGR15globalInitList2_, i64 0, i64 0), 907c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith// CHECK: %[[WITHARG]]** getelementptr inbounds (%{{.*}}* @globalInitList2, i32 0, i32 0), align 8 917c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith// CHECK: store i64 2, i64* getelementptr inbounds (%{{.*}}* @globalInitList2, i32 0, i32 1), align 8 9219b1a6eb2c90fab7cefe74bea5b6de490b65ac9dSebastian Redl// CHECK: call void @_ZN10destroyme1D1Ev 9319b1a6eb2c90fab7cefe74bea5b6de490b65ac9dSebastian Redl// CHECK: call void @_ZN10destroyme1D1Ev 9419b1a6eb2c90fab7cefe74bea5b6de490b65ac9dSebastian Redlstd::initializer_list<witharg1> globalInitList2 = { 9519b1a6eb2c90fab7cefe74bea5b6de490b65ac9dSebastian Redl witharg1(destroyme1()), witharg1(destroyme1()) 9619b1a6eb2c90fab7cefe74bea5b6de490b65ac9dSebastian Redl}; 9719b1a6eb2c90fab7cefe74bea5b6de490b65ac9dSebastian Redl 9832cf1f27ae8620e7b79bb4e81a067187c0aab7aeSebastian Redlvoid fn1(int i) { 9993ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin // CHECK-LABEL: define void @_Z3fn1i 10032cf1f27ae8620e7b79bb4e81a067187c0aab7aeSebastian Redl // temporary array 10132cf1f27ae8620e7b79bb4e81a067187c0aab7aeSebastian Redl // CHECK: [[array:%[^ ]+]] = alloca [3 x i32] 10232cf1f27ae8620e7b79bb4e81a067187c0aab7aeSebastian Redl // CHECK: getelementptr inbounds [3 x i32]* [[array]], i{{32|64}} 0 10332cf1f27ae8620e7b79bb4e81a067187c0aab7aeSebastian Redl // CHECK-NEXT: store i32 1, i32* 10432cf1f27ae8620e7b79bb4e81a067187c0aab7aeSebastian Redl // CHECK-NEXT: getelementptr 10532cf1f27ae8620e7b79bb4e81a067187c0aab7aeSebastian Redl // CHECK-NEXT: store 10632cf1f27ae8620e7b79bb4e81a067187c0aab7aeSebastian Redl // CHECK-NEXT: getelementptr 10732cf1f27ae8620e7b79bb4e81a067187c0aab7aeSebastian Redl // CHECK-NEXT: load 10832cf1f27ae8620e7b79bb4e81a067187c0aab7aeSebastian Redl // CHECK-NEXT: store 10932cf1f27ae8620e7b79bb4e81a067187c0aab7aeSebastian Redl // init the list 11032cf1f27ae8620e7b79bb4e81a067187c0aab7aeSebastian Redl // CHECK-NEXT: getelementptr 11132cf1f27ae8620e7b79bb4e81a067187c0aab7aeSebastian Redl // CHECK-NEXT: getelementptr inbounds [3 x i32]* 11232cf1f27ae8620e7b79bb4e81a067187c0aab7aeSebastian Redl // CHECK-NEXT: store i32* 11332cf1f27ae8620e7b79bb4e81a067187c0aab7aeSebastian Redl // CHECK-NEXT: getelementptr 11432cf1f27ae8620e7b79bb4e81a067187c0aab7aeSebastian Redl // CHECK-NEXT: store i{{32|64}} 3 11532cf1f27ae8620e7b79bb4e81a067187c0aab7aeSebastian Redl std::initializer_list<int> intlist{1, 2, i}; 11632cf1f27ae8620e7b79bb4e81a067187c0aab7aeSebastian Redl} 11732cf1f27ae8620e7b79bb4e81a067187c0aab7aeSebastian Redl 11832cf1f27ae8620e7b79bb4e81a067187c0aab7aeSebastian Redlvoid fn2() { 11993ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin // CHECK-LABEL: define void @_Z3fn2v 12032cf1f27ae8620e7b79bb4e81a067187c0aab7aeSebastian Redl void target(std::initializer_list<destroyme1>); 12132cf1f27ae8620e7b79bb4e81a067187c0aab7aeSebastian Redl // objects should be destroyed before dm2, after call returns 12225e640a6e11f455b9c12aa5f724f7d50d9174c9cSebastian Redl // CHECK: call void @_Z6targetSt16initializer_listI10destroyme1E 12332cf1f27ae8620e7b79bb4e81a067187c0aab7aeSebastian Redl target({ destroyme1(), destroyme1() }); 12432cf1f27ae8620e7b79bb4e81a067187c0aab7aeSebastian Redl // CHECK: call void @_ZN10destroyme1D1Ev 12532cf1f27ae8620e7b79bb4e81a067187c0aab7aeSebastian Redl destroyme2 dm2; 12632cf1f27ae8620e7b79bb4e81a067187c0aab7aeSebastian Redl // CHECK: call void @_ZN10destroyme2D1Ev 12732cf1f27ae8620e7b79bb4e81a067187c0aab7aeSebastian Redl} 12832cf1f27ae8620e7b79bb4e81a067187c0aab7aeSebastian Redl 12932cf1f27ae8620e7b79bb4e81a067187c0aab7aeSebastian Redlvoid fn3() { 13093ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin // CHECK-LABEL: define void @_Z3fn3v 13132cf1f27ae8620e7b79bb4e81a067187c0aab7aeSebastian Redl // objects should be destroyed after dm2 13232cf1f27ae8620e7b79bb4e81a067187c0aab7aeSebastian Redl auto list = { destroyme1(), destroyme1() }; 13332cf1f27ae8620e7b79bb4e81a067187c0aab7aeSebastian Redl destroyme2 dm2; 13432cf1f27ae8620e7b79bb4e81a067187c0aab7aeSebastian Redl // CHECK: call void @_ZN10destroyme2D1Ev 13532cf1f27ae8620e7b79bb4e81a067187c0aab7aeSebastian Redl // CHECK: call void @_ZN10destroyme1D1Ev 13632cf1f27ae8620e7b79bb4e81a067187c0aab7aeSebastian Redl} 13725e640a6e11f455b9c12aa5f724f7d50d9174c9cSebastian Redl 13825e640a6e11f455b9c12aa5f724f7d50d9174c9cSebastian Redlvoid fn4() { 13993ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin // CHECK-LABEL: define void @_Z3fn4v 14025e640a6e11f455b9c12aa5f724f7d50d9174c9cSebastian Redl void target(std::initializer_list<witharg1>); 14125e640a6e11f455b9c12aa5f724f7d50d9174c9cSebastian Redl // objects should be destroyed before dm2, after call returns 14225e640a6e11f455b9c12aa5f724f7d50d9174c9cSebastian Redl // CHECK: call void @_ZN8witharg1C1ERK10destroyme1 14325e640a6e11f455b9c12aa5f724f7d50d9174c9cSebastian Redl // CHECK: call void @_Z6targetSt16initializer_listI8witharg1E 14425e640a6e11f455b9c12aa5f724f7d50d9174c9cSebastian Redl target({ witharg1(destroyme1()), witharg1(destroyme1()) }); 14525e640a6e11f455b9c12aa5f724f7d50d9174c9cSebastian Redl // CHECK: call void @_ZN8witharg1D1Ev 14625e640a6e11f455b9c12aa5f724f7d50d9174c9cSebastian Redl // CHECK: call void @_ZN10destroyme1D1Ev 14725e640a6e11f455b9c12aa5f724f7d50d9174c9cSebastian Redl destroyme2 dm2; 14825e640a6e11f455b9c12aa5f724f7d50d9174c9cSebastian Redl // CHECK: call void @_ZN10destroyme2D1Ev 14925e640a6e11f455b9c12aa5f724f7d50d9174c9cSebastian Redl} 15025e640a6e11f455b9c12aa5f724f7d50d9174c9cSebastian Redl 15125e640a6e11f455b9c12aa5f724f7d50d9174c9cSebastian Redlvoid fn5() { 15293ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin // CHECK-LABEL: define void @_Z3fn5v 15325e640a6e11f455b9c12aa5f724f7d50d9174c9cSebastian Redl // temps should be destroyed before dm2 15425e640a6e11f455b9c12aa5f724f7d50d9174c9cSebastian Redl // objects should be destroyed after dm2 15525e640a6e11f455b9c12aa5f724f7d50d9174c9cSebastian Redl // CHECK: call void @_ZN8witharg1C1ERK10destroyme1 15625e640a6e11f455b9c12aa5f724f7d50d9174c9cSebastian Redl auto list = { witharg1(destroyme1()), witharg1(destroyme1()) }; 15725e640a6e11f455b9c12aa5f724f7d50d9174c9cSebastian Redl // CHECK: call void @_ZN10destroyme1D1Ev 15825e640a6e11f455b9c12aa5f724f7d50d9174c9cSebastian Redl destroyme2 dm2; 15925e640a6e11f455b9c12aa5f724f7d50d9174c9cSebastian Redl // CHECK: call void @_ZN10destroyme2D1Ev 16025e640a6e11f455b9c12aa5f724f7d50d9174c9cSebastian Redl // CHECK: call void @_ZN8witharg1D1Ev 16125e640a6e11f455b9c12aa5f724f7d50d9174c9cSebastian Redl} 162bac5cf4110c1c9ba0992fad4fd9f66cedc27f3daSebastian Redl 163bac5cf4110c1c9ba0992fad4fd9f66cedc27f3daSebastian Redlvoid fn6() { 16493ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin // CHECK-LABEL: define void @_Z3fn6v 165bac5cf4110c1c9ba0992fad4fd9f66cedc27f3daSebastian Redl void target(const wantslist1&); 166bac5cf4110c1c9ba0992fad4fd9f66cedc27f3daSebastian Redl // objects should be destroyed before dm2, after call returns 167bac5cf4110c1c9ba0992fad4fd9f66cedc27f3daSebastian Redl // CHECK: call void @_ZN10wantslist1C1ESt16initializer_listI10destroyme1E 168bac5cf4110c1c9ba0992fad4fd9f66cedc27f3daSebastian Redl // CHECK: call void @_Z6targetRK10wantslist1 169bac5cf4110c1c9ba0992fad4fd9f66cedc27f3daSebastian Redl target({ destroyme1(), destroyme1() }); 170bac5cf4110c1c9ba0992fad4fd9f66cedc27f3daSebastian Redl // CHECK: call void @_ZN10wantslist1D1Ev 171bac5cf4110c1c9ba0992fad4fd9f66cedc27f3daSebastian Redl // CHECK: call void @_ZN10destroyme1D1Ev 172bac5cf4110c1c9ba0992fad4fd9f66cedc27f3daSebastian Redl destroyme2 dm2; 173bac5cf4110c1c9ba0992fad4fd9f66cedc27f3daSebastian Redl // CHECK: call void @_ZN10destroyme2D1Ev 174bac5cf4110c1c9ba0992fad4fd9f66cedc27f3daSebastian Redl} 175bac5cf4110c1c9ba0992fad4fd9f66cedc27f3daSebastian Redl 176bac5cf4110c1c9ba0992fad4fd9f66cedc27f3daSebastian Redlvoid fn7() { 17793ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin // CHECK-LABEL: define void @_Z3fn7v 178bac5cf4110c1c9ba0992fad4fd9f66cedc27f3daSebastian Redl // temps should be destroyed before dm2 179bac5cf4110c1c9ba0992fad4fd9f66cedc27f3daSebastian Redl // object should be destroyed after dm2 180bac5cf4110c1c9ba0992fad4fd9f66cedc27f3daSebastian Redl // CHECK: call void @_ZN10wantslist1C1ESt16initializer_listI10destroyme1E 181bac5cf4110c1c9ba0992fad4fd9f66cedc27f3daSebastian Redl wantslist1 wl = { destroyme1(), destroyme1() }; 182bac5cf4110c1c9ba0992fad4fd9f66cedc27f3daSebastian Redl // CHECK: call void @_ZN10destroyme1D1Ev 183bac5cf4110c1c9ba0992fad4fd9f66cedc27f3daSebastian Redl destroyme2 dm2; 184bac5cf4110c1c9ba0992fad4fd9f66cedc27f3daSebastian Redl // CHECK: call void @_ZN10destroyme2D1Ev 185bac5cf4110c1c9ba0992fad4fd9f66cedc27f3daSebastian Redl // CHECK: call void @_ZN10wantslist1D1Ev 186bac5cf4110c1c9ba0992fad4fd9f66cedc27f3daSebastian Redl} 187af130fd78267ee9e2395b758a7d827b07ce317a0Sebastian Redl 188af130fd78267ee9e2395b758a7d827b07ce317a0Sebastian Redlvoid fn8() { 18993ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin // CHECK-LABEL: define void @_Z3fn8v 190af130fd78267ee9e2395b758a7d827b07ce317a0Sebastian Redl void target(std::initializer_list<std::initializer_list<destroyme1>>); 191af130fd78267ee9e2395b758a7d827b07ce317a0Sebastian Redl // objects should be destroyed before dm2, after call returns 192af130fd78267ee9e2395b758a7d827b07ce317a0Sebastian Redl // CHECK: call void @_Z6targetSt16initializer_listIS_I10destroyme1EE 193af130fd78267ee9e2395b758a7d827b07ce317a0Sebastian Redl std::initializer_list<destroyme1> inner; 194af130fd78267ee9e2395b758a7d827b07ce317a0Sebastian Redl target({ inner, { destroyme1() } }); 195af130fd78267ee9e2395b758a7d827b07ce317a0Sebastian Redl // CHECK: call void @_ZN10destroyme1D1Ev 196af130fd78267ee9e2395b758a7d827b07ce317a0Sebastian Redl // Only one destroy loop, since only one inner init list is directly inited. 197af130fd78267ee9e2395b758a7d827b07ce317a0Sebastian Redl // CHECK-NOT: call void @_ZN10destroyme1D1Ev 198af130fd78267ee9e2395b758a7d827b07ce317a0Sebastian Redl destroyme2 dm2; 199af130fd78267ee9e2395b758a7d827b07ce317a0Sebastian Redl // CHECK: call void @_ZN10destroyme2D1Ev 200af130fd78267ee9e2395b758a7d827b07ce317a0Sebastian Redl} 201af130fd78267ee9e2395b758a7d827b07ce317a0Sebastian Redl 202af130fd78267ee9e2395b758a7d827b07ce317a0Sebastian Redlvoid fn9() { 20393ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin // CHECK-LABEL: define void @_Z3fn9v 204af130fd78267ee9e2395b758a7d827b07ce317a0Sebastian Redl // objects should be destroyed after dm2 205af130fd78267ee9e2395b758a7d827b07ce317a0Sebastian Redl std::initializer_list<destroyme1> inner; 206af130fd78267ee9e2395b758a7d827b07ce317a0Sebastian Redl std::initializer_list<std::initializer_list<destroyme1>> list = 207af130fd78267ee9e2395b758a7d827b07ce317a0Sebastian Redl { inner, { destroyme1() } }; 208af130fd78267ee9e2395b758a7d827b07ce317a0Sebastian Redl destroyme2 dm2; 209af130fd78267ee9e2395b758a7d827b07ce317a0Sebastian Redl // CHECK: call void @_ZN10destroyme2D1Ev 210af130fd78267ee9e2395b758a7d827b07ce317a0Sebastian Redl // CHECK: call void @_ZN10destroyme1D1Ev 211af130fd78267ee9e2395b758a7d827b07ce317a0Sebastian Redl // Only one destroy loop, since only one inner init list is directly inited. 212af130fd78267ee9e2395b758a7d827b07ce317a0Sebastian Redl // CHECK-NOT: call void @_ZN10destroyme1D1Ev 213af130fd78267ee9e2395b758a7d827b07ce317a0Sebastian Redl // CHECK: ret void 214af130fd78267ee9e2395b758a7d827b07ce317a0Sebastian Redl} 215924db71fc8f6076c532c8c2ae93acc7f477452c8Sebastian Redl 216924db71fc8f6076c532c8c2ae93acc7f477452c8Sebastian Redlstruct haslist1 { 217924db71fc8f6076c532c8c2ae93acc7f477452c8Sebastian Redl std::initializer_list<int> il; 218924db71fc8f6076c532c8c2ae93acc7f477452c8Sebastian Redl haslist1(); 219924db71fc8f6076c532c8c2ae93acc7f477452c8Sebastian Redl}; 220924db71fc8f6076c532c8c2ae93acc7f477452c8Sebastian Redl 22193ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-LABEL: define void @_ZN8haslist1C2Ev 222924db71fc8f6076c532c8c2ae93acc7f477452c8Sebastian Redlhaslist1::haslist1() 223924db71fc8f6076c532c8c2ae93acc7f477452c8Sebastian Redl// CHECK: alloca [3 x i32] 224924db71fc8f6076c532c8c2ae93acc7f477452c8Sebastian Redl// CHECK: store i32 1 225924db71fc8f6076c532c8c2ae93acc7f477452c8Sebastian Redl// CHECK: store i32 2 226924db71fc8f6076c532c8c2ae93acc7f477452c8Sebastian Redl// CHECK: store i32 3 227924db71fc8f6076c532c8c2ae93acc7f477452c8Sebastian Redl// CHECK: store i{{32|64}} 3 228924db71fc8f6076c532c8c2ae93acc7f477452c8Sebastian Redl : il{1, 2, 3} 229924db71fc8f6076c532c8c2ae93acc7f477452c8Sebastian Redl{ 230924db71fc8f6076c532c8c2ae93acc7f477452c8Sebastian Redl destroyme2 dm2; 231924db71fc8f6076c532c8c2ae93acc7f477452c8Sebastian Redl} 232924db71fc8f6076c532c8c2ae93acc7f477452c8Sebastian Redl 233924db71fc8f6076c532c8c2ae93acc7f477452c8Sebastian Redlstruct haslist2 { 234924db71fc8f6076c532c8c2ae93acc7f477452c8Sebastian Redl std::initializer_list<destroyme1> il; 235924db71fc8f6076c532c8c2ae93acc7f477452c8Sebastian Redl haslist2(); 236924db71fc8f6076c532c8c2ae93acc7f477452c8Sebastian Redl}; 237924db71fc8f6076c532c8c2ae93acc7f477452c8Sebastian Redl 23893ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-LABEL: define void @_ZN8haslist2C2Ev 239924db71fc8f6076c532c8c2ae93acc7f477452c8Sebastian Redlhaslist2::haslist2() 240924db71fc8f6076c532c8c2ae93acc7f477452c8Sebastian Redl : il{destroyme1(), destroyme1()} 241924db71fc8f6076c532c8c2ae93acc7f477452c8Sebastian Redl{ 242924db71fc8f6076c532c8c2ae93acc7f477452c8Sebastian Redl destroyme2 dm2; 243924db71fc8f6076c532c8c2ae93acc7f477452c8Sebastian Redl // CHECK: call void @_ZN10destroyme2D1Ev 244924db71fc8f6076c532c8c2ae93acc7f477452c8Sebastian Redl // CHECK: call void @_ZN10destroyme1D1Ev 245924db71fc8f6076c532c8c2ae93acc7f477452c8Sebastian Redl} 246972edf0534d8a50f87fac1d0ff34eb22f593df11Sebastian Redl 247972edf0534d8a50f87fac1d0ff34eb22f593df11Sebastian Redlvoid fn10() { 24893ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin // CHECK-LABEL: define void @_Z4fn10v 249972edf0534d8a50f87fac1d0ff34eb22f593df11Sebastian Redl // CHECK: alloca [3 x i32] 2504b45d7ff9c45ecf6126c4bb939057687483a9726Benjamin Kramer // CHECK: call noalias i8* @_Znw{{[jm]}} 251972edf0534d8a50f87fac1d0ff34eb22f593df11Sebastian Redl // CHECK: store i32 1 252972edf0534d8a50f87fac1d0ff34eb22f593df11Sebastian Redl // CHECK: store i32 2 253972edf0534d8a50f87fac1d0ff34eb22f593df11Sebastian Redl // CHECK: store i32 3 254972edf0534d8a50f87fac1d0ff34eb22f593df11Sebastian Redl // CHECK: store i32* 255972edf0534d8a50f87fac1d0ff34eb22f593df11Sebastian Redl // CHECK: store i{{32|64}} 3 256972edf0534d8a50f87fac1d0ff34eb22f593df11Sebastian Redl (void) new std::initializer_list<int> {1, 2, 3}; 257972edf0534d8a50f87fac1d0ff34eb22f593df11Sebastian Redl} 258972edf0534d8a50f87fac1d0ff34eb22f593df11Sebastian Redl 259972edf0534d8a50f87fac1d0ff34eb22f593df11Sebastian Redlvoid fn11() { 26093ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin // CHECK-LABEL: define void @_Z4fn11v 261972edf0534d8a50f87fac1d0ff34eb22f593df11Sebastian Redl (void) new std::initializer_list<destroyme1> {destroyme1(), destroyme1()}; 262972edf0534d8a50f87fac1d0ff34eb22f593df11Sebastian Redl // CHECK: call void @_ZN10destroyme1D1Ev 263972edf0534d8a50f87fac1d0ff34eb22f593df11Sebastian Redl destroyme2 dm2; 264972edf0534d8a50f87fac1d0ff34eb22f593df11Sebastian Redl // CHECK: call void @_ZN10destroyme2D1Ev 265972edf0534d8a50f87fac1d0ff34eb22f593df11Sebastian Redl} 2662835745a451002798fed9800aeb19277f6a8fcb3Sebastian Redl 2672835745a451002798fed9800aeb19277f6a8fcb3Sebastian Redlnamespace PR12178 { 2682835745a451002798fed9800aeb19277f6a8fcb3Sebastian Redl struct string { 2692835745a451002798fed9800aeb19277f6a8fcb3Sebastian Redl string(int); 2702835745a451002798fed9800aeb19277f6a8fcb3Sebastian Redl ~string(); 2712835745a451002798fed9800aeb19277f6a8fcb3Sebastian Redl }; 2722835745a451002798fed9800aeb19277f6a8fcb3Sebastian Redl 2732835745a451002798fed9800aeb19277f6a8fcb3Sebastian Redl struct pair { 2742835745a451002798fed9800aeb19277f6a8fcb3Sebastian Redl string a; 2752835745a451002798fed9800aeb19277f6a8fcb3Sebastian Redl int b; 2762835745a451002798fed9800aeb19277f6a8fcb3Sebastian Redl }; 2772835745a451002798fed9800aeb19277f6a8fcb3Sebastian Redl 2782835745a451002798fed9800aeb19277f6a8fcb3Sebastian Redl struct map { 2792835745a451002798fed9800aeb19277f6a8fcb3Sebastian Redl map(std::initializer_list<pair>); 2802835745a451002798fed9800aeb19277f6a8fcb3Sebastian Redl }; 2812835745a451002798fed9800aeb19277f6a8fcb3Sebastian Redl 2822835745a451002798fed9800aeb19277f6a8fcb3Sebastian Redl map m{ {1, 2}, {3, 4} }; 2832835745a451002798fed9800aeb19277f6a8fcb3Sebastian Redl} 28429a11f45849aa87959e780abb0014a1876e0b39eDouglas Gregor 28529a11f45849aa87959e780abb0014a1876e0b39eDouglas Gregornamespace rdar13325066 { 28629a11f45849aa87959e780abb0014a1876e0b39eDouglas Gregor struct X { ~X(); }; 28729a11f45849aa87959e780abb0014a1876e0b39eDouglas Gregor 28893ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin // CHECK-LABEL: define void @_ZN12rdar133250664loopERNS_1XES1_ 28929a11f45849aa87959e780abb0014a1876e0b39eDouglas Gregor void loop(X &x1, X &x2) { 29029a11f45849aa87959e780abb0014a1876e0b39eDouglas Gregor // CHECK: br label 29129a11f45849aa87959e780abb0014a1876e0b39eDouglas Gregor // CHECK: br i1 29229a11f45849aa87959e780abb0014a1876e0b39eDouglas Gregor // CHECK: br label 29329a11f45849aa87959e780abb0014a1876e0b39eDouglas Gregor // CHECK call void @_ZN12rdar133250661XD1Ev 29429a11f45849aa87959e780abb0014a1876e0b39eDouglas Gregor // CHECK: br label 29529a11f45849aa87959e780abb0014a1876e0b39eDouglas Gregor // CHECK: br label 29629a11f45849aa87959e780abb0014a1876e0b39eDouglas Gregor // CHECK: call void @_ZN12rdar133250661XD1Ev 29729a11f45849aa87959e780abb0014a1876e0b39eDouglas Gregor // CHECK: br i1 29829a11f45849aa87959e780abb0014a1876e0b39eDouglas Gregor // CHECK: br label 29929a11f45849aa87959e780abb0014a1876e0b39eDouglas Gregor // CHECK: ret void 30029a11f45849aa87959e780abb0014a1876e0b39eDouglas Gregor for (X x : { x1, x2 }) { } 30129a11f45849aa87959e780abb0014a1876e0b39eDouglas Gregor } 30229a11f45849aa87959e780abb0014a1876e0b39eDouglas Gregor} 303e69fb2043519d8f36314dd5dd78bb7638c6140f6Richard Smith 304e69fb2043519d8f36314dd5dd78bb7638c6140f6Richard Smithnamespace dtors { 305e69fb2043519d8f36314dd5dd78bb7638c6140f6Richard Smith struct S { 306e69fb2043519d8f36314dd5dd78bb7638c6140f6Richard Smith S(); 307e69fb2043519d8f36314dd5dd78bb7638c6140f6Richard Smith ~S(); 308e69fb2043519d8f36314dd5dd78bb7638c6140f6Richard Smith }; 3097c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith void z(); 3107c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith 31193ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin // CHECK-LABEL: define void @_ZN5dtors1fEv( 312e69fb2043519d8f36314dd5dd78bb7638c6140f6Richard Smith void f() { 3137b7db26d78509c0692d0000bbed1b0cf5e18ece8Richard Smith // CHECK: call void @_ZN5dtors1SC1Ev( 3147b7db26d78509c0692d0000bbed1b0cf5e18ece8Richard Smith // CHECK: call void @_ZN5dtors1SC1Ev( 315e69fb2043519d8f36314dd5dd78bb7638c6140f6Richard Smith std::initializer_list<S>{ S(), S() }; 3167c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith 3177c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith // Destruction loop for underlying array. 3187c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith // CHECK: br label 3197c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith // CHECK: call void @_ZN5dtors1SD1Ev( 3207c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith // CHECK: br i1 3217c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith 3227c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith // CHECK: call void @_ZN5dtors1zEv( 3237c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith z(); 3247c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith 3257c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith // CHECK-NOT: call void @_ZN5dtors1SD1Ev( 326e69fb2043519d8f36314dd5dd78bb7638c6140f6Richard Smith } 3277c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith 32893ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin // CHECK-LABEL: define void @_ZN5dtors1gEv( 329211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith void g() { 3307b7db26d78509c0692d0000bbed1b0cf5e18ece8Richard Smith // CHECK: call void @_ZN5dtors1SC1Ev( 3317b7db26d78509c0692d0000bbed1b0cf5e18ece8Richard Smith // CHECK: call void @_ZN5dtors1SC1Ev( 332211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith auto x = std::initializer_list<S>{ S(), S() }; 3337c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith 3347c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith // Destruction loop for underlying array. 3357c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith // CHECK: br label 3367c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith // CHECK: call void @_ZN5dtors1SD1Ev( 3377c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith // CHECK: br i1 3387c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith 3397c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith // CHECK: call void @_ZN5dtors1zEv( 3407c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith z(); 3417c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith 3427c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith // CHECK-NOT: call void @_ZN5dtors1SD1Ev( 3437c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith } 3447c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith 34593ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin // CHECK-LABEL: define void @_ZN5dtors1hEv( 3467c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith void h() { 3477b7db26d78509c0692d0000bbed1b0cf5e18ece8Richard Smith // CHECK: call void @_ZN5dtors1SC1Ev( 3487b7db26d78509c0692d0000bbed1b0cf5e18ece8Richard Smith // CHECK: call void @_ZN5dtors1SC1Ev( 3497c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith std::initializer_list<S> x = { S(), S() }; 3507c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith 3517c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith // CHECK-NOT: call void @_ZN5dtors1SD1Ev( 3527c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith 3537c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith // CHECK: call void @_ZN5dtors1zEv( 3547c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith z(); 3557c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith 3567c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith // Destruction loop for underlying array. 3577c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith // CHECK: br label 3587c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith // CHECK: call void @_ZN5dtors1SD1Ev( 3597c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith // CHECK: br i1 360211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith } 361e69fb2043519d8f36314dd5dd78bb7638c6140f6Richard Smith} 3623282b84296dba58e811741b63e4429980a98df8bRichard Smith 3633282b84296dba58e811741b63e4429980a98df8bRichard Smithnamespace partly_constant { 3643282b84296dba58e811741b63e4429980a98df8bRichard Smith int k; 3653282b84296dba58e811741b63e4429980a98df8bRichard Smith std::initializer_list<std::initializer_list<int>> &&il = { { 1, 2, 3 }, { 4, k }, { 5, 6, 7, 8 } }; 3663282b84296dba58e811741b63e4429980a98df8bRichard Smith // First init list. 3673282b84296dba58e811741b63e4429980a98df8bRichard Smith // CHECK-NOT: @[[PARTLY_CONSTANT_FIRST]], 3683282b84296dba58e811741b63e4429980a98df8bRichard Smith // CHECK: store i32* getelementptr inbounds ({{.*}}* @[[PARTLY_CONSTANT_FIRST]], i64 0, i64 0), 3693282b84296dba58e811741b63e4429980a98df8bRichard Smith // CHECK: i32** getelementptr inbounds ({{.*}}* @[[PARTLY_CONSTANT_INNER]], i64 0, i64 0, i32 0) 3703282b84296dba58e811741b63e4429980a98df8bRichard Smith // CHECK: store i64 3, i64* getelementptr inbounds ({{.*}}* @[[PARTLY_CONSTANT_INNER]], i64 0, i64 0, i32 1) 3713282b84296dba58e811741b63e4429980a98df8bRichard Smith // CHECK-NOT: @[[PARTLY_CONSTANT_FIRST]], 3723282b84296dba58e811741b63e4429980a98df8bRichard Smith // 3733282b84296dba58e811741b63e4429980a98df8bRichard Smith // Second init list array (non-constant). 3743282b84296dba58e811741b63e4429980a98df8bRichard Smith // CHECK: store i32 4, i32* getelementptr inbounds ({{.*}}* @[[PARTLY_CONSTANT_SECOND]], i64 0, i64 0) 3753282b84296dba58e811741b63e4429980a98df8bRichard Smith // CHECK: load i32* @_ZN15partly_constant1kE 3763282b84296dba58e811741b63e4429980a98df8bRichard Smith // CHECK: store i32 {{.*}}, i32* getelementptr inbounds ({{.*}}* @[[PARTLY_CONSTANT_SECOND]], i64 0, i64 1) 3773282b84296dba58e811741b63e4429980a98df8bRichard Smith // 3783282b84296dba58e811741b63e4429980a98df8bRichard Smith // Second init list. 3793282b84296dba58e811741b63e4429980a98df8bRichard Smith // CHECK: store i32* getelementptr inbounds ({{.*}}* @[[PARTLY_CONSTANT_SECOND]], i64 0, i64 0), 3803282b84296dba58e811741b63e4429980a98df8bRichard Smith // CHECK: i32** getelementptr inbounds ({{.*}}* @[[PARTLY_CONSTANT_INNER]], i64 0, i64 1, i32 0) 3813282b84296dba58e811741b63e4429980a98df8bRichard Smith // CHECK: store i64 2, i64* getelementptr inbounds ({{.*}}* @[[PARTLY_CONSTANT_INNER]], i64 0, i64 1, i32 1) 3823282b84296dba58e811741b63e4429980a98df8bRichard Smith // 3833282b84296dba58e811741b63e4429980a98df8bRichard Smith // Third init list. 3843282b84296dba58e811741b63e4429980a98df8bRichard Smith // CHECK-NOT: @[[PARTLY_CONSTANT_THIRD]], 3853282b84296dba58e811741b63e4429980a98df8bRichard Smith // CHECK: store i32* getelementptr inbounds ({{.*}}* @[[PARTLY_CONSTANT_THIRD]], i64 0, i64 0), 3863282b84296dba58e811741b63e4429980a98df8bRichard Smith // CHECK: i32** getelementptr inbounds ({{.*}}* @[[PARTLY_CONSTANT_INNER]], i64 0, i64 2, i32 0) 3876bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // CHECK: store i64 4, i64* getelementptr inbounds ({{.*}}* @_ZGRN15partly_constant2ilE4_, i64 0, i64 2, i32 1) 3883282b84296dba58e811741b63e4429980a98df8bRichard Smith // CHECK-NOT: @[[PARTLY_CONSTANT_THIRD]], 3893282b84296dba58e811741b63e4429980a98df8bRichard Smith // 3903282b84296dba58e811741b63e4429980a98df8bRichard Smith // Outer init list. 3913282b84296dba58e811741b63e4429980a98df8bRichard Smith // CHECK: store {{.*}}* getelementptr inbounds ({{.*}}* @[[PARTLY_CONSTANT_INNER]], i64 0, i64 0), 3923282b84296dba58e811741b63e4429980a98df8bRichard Smith // CHECK: {{.*}}** getelementptr inbounds ({{.*}}* @[[PARTLY_CONSTANT_OUTER]], i32 0, i32 0) 3933282b84296dba58e811741b63e4429980a98df8bRichard Smith // CHECK: store i64 3, i64* getelementptr inbounds ({{.*}}* @[[PARTLY_CONSTANT_OUTER]], i32 0, i32 1) 3943282b84296dba58e811741b63e4429980a98df8bRichard Smith // 3953282b84296dba58e811741b63e4429980a98df8bRichard Smith // 'il' reference. 3963282b84296dba58e811741b63e4429980a98df8bRichard Smith // CHECK: store {{.*}}* @[[PARTLY_CONSTANT_OUTER]], {{.*}}** @_ZN15partly_constant2ilE, align 8 3973282b84296dba58e811741b63e4429980a98df8bRichard Smith} 3985771aab8027e317de1e3f2f67b5dae67b3d895f8Richard Smith 3995771aab8027e317de1e3f2f67b5dae67b3d895f8Richard Smithnamespace nested { 4005771aab8027e317de1e3f2f67b5dae67b3d895f8Richard Smith struct A { A(); ~A(); }; 4015771aab8027e317de1e3f2f67b5dae67b3d895f8Richard Smith struct B { const A &a; ~B(); }; 4025771aab8027e317de1e3f2f67b5dae67b3d895f8Richard Smith struct C { std::initializer_list<B> b; ~C(); }; 4035771aab8027e317de1e3f2f67b5dae67b3d895f8Richard Smith void f(); 40493ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin // CHECK-LABEL: define void @_ZN6nested1gEv( 4055771aab8027e317de1e3f2f67b5dae67b3d895f8Richard Smith void g() { 4065771aab8027e317de1e3f2f67b5dae67b3d895f8Richard Smith // CHECK: call void @_ZN6nested1AC1Ev( 4075771aab8027e317de1e3f2f67b5dae67b3d895f8Richard Smith // CHECK-NOT: call 4085771aab8027e317de1e3f2f67b5dae67b3d895f8Richard Smith // CHECK: call void @_ZN6nested1AC1Ev( 4095771aab8027e317de1e3f2f67b5dae67b3d895f8Richard Smith // CHECK-NOT: call 4105771aab8027e317de1e3f2f67b5dae67b3d895f8Richard Smith const C &c { { { A() }, { A() } } }; 4115771aab8027e317de1e3f2f67b5dae67b3d895f8Richard Smith 4125771aab8027e317de1e3f2f67b5dae67b3d895f8Richard Smith // CHECK: call void @_ZN6nested1fEv( 4135771aab8027e317de1e3f2f67b5dae67b3d895f8Richard Smith // CHECK-NOT: call 4145771aab8027e317de1e3f2f67b5dae67b3d895f8Richard Smith f(); 4155771aab8027e317de1e3f2f67b5dae67b3d895f8Richard Smith 4165771aab8027e317de1e3f2f67b5dae67b3d895f8Richard Smith // CHECK: call void @_ZN6nested1CD1Ev( 4175771aab8027e317de1e3f2f67b5dae67b3d895f8Richard Smith // CHECK-NOT: call 4185771aab8027e317de1e3f2f67b5dae67b3d895f8Richard Smith 4195771aab8027e317de1e3f2f67b5dae67b3d895f8Richard Smith // Destroy B[2] array. 4205771aab8027e317de1e3f2f67b5dae67b3d895f8Richard Smith // FIXME: This isn't technically correct: reverse construction order would 4215771aab8027e317de1e3f2f67b5dae67b3d895f8Richard Smith // destroy the second B then the second A then the first B then the first A. 4225771aab8027e317de1e3f2f67b5dae67b3d895f8Richard Smith // CHECK: call void @_ZN6nested1BD1Ev( 4235771aab8027e317de1e3f2f67b5dae67b3d895f8Richard Smith // CHECK-NOT: call 4245771aab8027e317de1e3f2f67b5dae67b3d895f8Richard Smith // CHECK: br 4255771aab8027e317de1e3f2f67b5dae67b3d895f8Richard Smith 4265771aab8027e317de1e3f2f67b5dae67b3d895f8Richard Smith // CHECK-NOT: call 4275771aab8027e317de1e3f2f67b5dae67b3d895f8Richard Smith // CHECK: call void @_ZN6nested1AD1Ev( 4285771aab8027e317de1e3f2f67b5dae67b3d895f8Richard Smith // CHECK-NOT: call 4295771aab8027e317de1e3f2f67b5dae67b3d895f8Richard Smith // CHECK: call void @_ZN6nested1AD1Ev( 4305771aab8027e317de1e3f2f67b5dae67b3d895f8Richard Smith // CHECK-NOT: call 4315771aab8027e317de1e3f2f67b5dae67b3d895f8Richard Smith // CHECK: } 4325771aab8027e317de1e3f2f67b5dae67b3d895f8Richard Smith } 4335771aab8027e317de1e3f2f67b5dae67b3d895f8Richard Smith} 434ef8225444452a1486bd721f3285301fe84643b00Stephen Hines 435ef8225444452a1486bd721f3285301fe84643b00Stephen Hinesnamespace DR1070 { 436ef8225444452a1486bd721f3285301fe84643b00Stephen Hines struct A { 437ef8225444452a1486bd721f3285301fe84643b00Stephen Hines A(std::initializer_list<int>); 438ef8225444452a1486bd721f3285301fe84643b00Stephen Hines }; 439ef8225444452a1486bd721f3285301fe84643b00Stephen Hines struct B { 440ef8225444452a1486bd721f3285301fe84643b00Stephen Hines int i; 441ef8225444452a1486bd721f3285301fe84643b00Stephen Hines A a; 442ef8225444452a1486bd721f3285301fe84643b00Stephen Hines }; 443ef8225444452a1486bd721f3285301fe84643b00Stephen Hines B b = {1}; 444ef8225444452a1486bd721f3285301fe84643b00Stephen Hines struct C { 445ef8225444452a1486bd721f3285301fe84643b00Stephen Hines std::initializer_list<int> a; 446ef8225444452a1486bd721f3285301fe84643b00Stephen Hines B b; 447ef8225444452a1486bd721f3285301fe84643b00Stephen Hines std::initializer_list<double> c; 448ef8225444452a1486bd721f3285301fe84643b00Stephen Hines }; 449ef8225444452a1486bd721f3285301fe84643b00Stephen Hines C c = {}; 450ef8225444452a1486bd721f3285301fe84643b00Stephen Hines} 451ef8225444452a1486bd721f3285301fe84643b00Stephen Hines 452ef8225444452a1486bd721f3285301fe84643b00Stephen Hinesnamespace ArrayOfInitList { 453ef8225444452a1486bd721f3285301fe84643b00Stephen Hines struct S { 454ef8225444452a1486bd721f3285301fe84643b00Stephen Hines S(std::initializer_list<int>); 455ef8225444452a1486bd721f3285301fe84643b00Stephen Hines }; 456ef8225444452a1486bd721f3285301fe84643b00Stephen Hines S x[1] = {}; 457ef8225444452a1486bd721f3285301fe84643b00Stephen Hines} 458