blob: 290d3dfd61e7d5f9b99841120125e6f48f53e706 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
|
// PR c++/117504 - Initial report
// { dg-do "run" { target c++20 } }
struct span {
span (const int (&__first)[1]) : _M_ptr (__first) {}
int operator[] (long __i) { return _M_ptr[__i]; }
const int *_M_ptr;
};
constexpr int a_global_vec[]{1};
span myFunctor() {
return a_global_vec;
}
int main() {
constexpr int a_vec[]{1};
//
// This PR's case, that used to be miscompiled.
//
auto lambda_1 = [&a_vec] () -> span { return a_vec; };
auto vec_1 { lambda_1 () };
if (vec_1[0] != 1)
__builtin_abort ();
// Variant that used to be miscompiled as well.
auto lambda_2 = [&] () -> span { return a_vec; };
auto vec_2 { lambda_2 () };
if (vec_2[0] != 1)
__builtin_abort ();
//
// Related cases that worked already.
//
auto lambda_3 = [&a_vec] () /* -> span */ { return a_vec; };
auto vec_3 { lambda_3 () };
if (vec_3[0] != 1)
__builtin_abort ();
auto lambda_4 = [&] () /* -> span */ { return a_vec; };
auto vec_4 { lambda_4 () };
if (vec_4[0] != 1)
__builtin_abort ();
const int (&vec_5)[1] = a_vec;
if (vec_5[0] != 1)
__builtin_abort ();
span vec_6 (a_vec);
if (vec_6[0] != 1)
__builtin_abort ();
auto vec_7 = myFunctor ();
if (vec_7[0] != 1)
__builtin_abort ();
const int (&vec_8)[1] { a_vec };
if (vec_8[0] != 1)
__builtin_abort ();
}
|