EricWF added a comment.
In http://reviews.llvm.org/D12247#231444, @yiranwang wrote:
> A test case is as following. It has to be build by GCC 4.9 -O3 (maybe or
> later), with latest libc++, and for AARCH64+ANDROID target.
> AARCH64 requires 128 bit alignment for aligned_storage and 64 bit pointers,
> while gcc 4.9 alias analysis will do field-sensitive points-to analysis. But
> this could happen for other ISA+ABI.
> The fundamental issue is that for this combination, std::function has member
> __buf_ declared as
> aligned_storage<3*sizoef(void*)>::type __buf_;
> Basically, it is
> aligned_storage<24>::type;
> This will generate aligned_storage of, _Len==24 and _Align==16;
> While std::function will use the __buf_ to sizeof(__buf_) bytes (at line
> 1593 and 1628 of <functional>), which is 32. Basically, the pointer to
> "tbool' will be stored at "&__buf_+24".
> This is not a well defined memory area, and GCC alias analysis is going to
> ignore the "ESCAPE" of address of "tbool". Basically, the function
> "test_simple" would always return "false".
>
> #include <functional>
> extern void external_test(std::function<bool()>fn);
> extern bool test_simple(){
>
> bool tbool = false;
> int a, b;
> external_test([&a, &b, &tbool](){
> tbool = true;
> return true;
> });
> return tbool;
>
> }
What GCC flags do I need to build it in this configuration?
http://reviews.llvm.org/D12247
_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits