https://gcc.gnu.org/bugzilla/show_bug.cgi?id=102573

--- Comment #4 from wjf <13508417 at qq dot com> ---
Hi Andrew,

I've updated my gcc to 10.2.1, and find while it did show what you said for my
initial code snippet, it won't warn me anything, nor report error at runtime
with -fsanitize=address (note that clang version 10.0.0 will report error at
runtime however), for below two code snippets:

----

code 1:
#include<iostream>
#include<initializer_list>
using namespace std;

int main()
{
    initializer_list<int> il({111, 222});

    cout << "initializer_list size: " << il.size() << endl;
    cout << "initializer_list underlying elements: " << endl;
    for (auto i : il)
        cout << i << endl;

    return 0;
}

----

code 2:
#include<iostream>
#include<initializer_list>
using namespace std;

int main()
{
    initializer_list<int> il;
    {
        initializer_list<int> il2 = {111, 222};
        il = il2;
    }

    cout << "initializer_list size: " << il.size() << endl;
    cout << "initializer_list underlying elements: " << endl;
    for (auto i : il)
        cout << i << endl;

    return 0;
}

----

As you can see, above two code snippets should still have the similar
"lifespan" issue. code 1's il constructs from an temporary, but doesn't extend
the lifetime of the underlying array. code 2's il is assigned from il2, but
have longer lifetime than il2. When using clang++ optimization, the output will
be something like below:

initializer_list size: 2
initializer_list underlying elements:
1877862544
32767

Reply via email to