ahatanak added a comment. In http://reviews.llvm.org/D20045#425903, @manmanren wrote:
> After r231508 made changes to promote constant temporaries to globals, the > assert fires when a std::initializer_list is constructed using Objective-C > string literals. > > --> Can you explain the code path after r231508 for your example? Will > r231508 change the code path if we start with a global? > r231508 seems to change the behavior constant temporaries only. I think your question is about the following case where initializer_list is used to initialize a global variable? const std::vector<NSString*> CfgFiles = {@"Test0", @"Test1", @"Test2", @"Test3"}; This is not different from the case where the vector is declared inside a function. In both cases, a temporary std::initializer_list is created and passed to std::vector's constructor. r231508 made changes to create a global array of strings (@.ref.tmp in the IR shown below). @.ref.tmp = private constant [4 x %0*] [%0* bitcast (%struct.__NSConstantString_tag* @_unnamed_cfstring_ to %0*), %0* bitcast (%struct.__NSConstantString_tag* @_unnamed_cfstring_.2 to %0*), %0* bitcast (%struct.__NSConstantString_tag* @_unnamed_cfstring_.4 to %0*), %0* bitcast (%struct.__NSConstantString_tag* @_unnamed_cfstring_.6 to %0*)], align 8 ... %agg.tmp = alloca %"class.std::initializer_list", align 8 ; temporary std::initializer_list %__begin_ = getelementptr inbounds %"class.std::initializer_list", %"class.std::initializer_list"* %agg.tmp, i32 0, i32 0 store %0** getelementptr inbounds ([4 x %0*], [4 x %0*]* @.ref.tmp, i64 0, i64 0), %0*** %__begin_, align 8, !tbaa !7 ; std::initializer_list holds a pointer to the array. http://reviews.llvm.org/D20045 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits