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

Reply via email to