https://gcc.gnu.org/bugzilla/show_bug.cgi?id=124219
Bug ID: 124219
Summary: define_static_array fail when struct contains static
string from another function
Product: gcc
Version: 16.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c++
Assignee: unassigned at gcc dot gnu.org
Reporter: chzn at mail dot ustc.edu.cn
Target Milestone: ---
I'm using compiler explorer, with gcc trunk:
https://godbolt.org/z/4eo9q4694
the folloing code:
```
struct S {
const char*str;
};
[]() {
auto str=[]() {
const char*str=define_static_string("123");
std::vector<S> v;
v.push_back({str});
return define_static_array(v);
}()[0];
std::vector<S> v;
v.push_back({str});
return define_static_array(v);
}();
```
result in:
```
.../include/c++/16.0.1/meta:625:50: error: 'const main()::S [1]{main()::S()}'
is not a constant expression
625 | auto __array = meta::reflect_constant_array(__r);
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~
<source>: In function 'int main()':
<source>:18:6: error: call to consteval function '<lambda closure
object>main()::<lambda()>().main()::<lambda()>()' is not a constant expression
```
But all the following similar code are valid:
```
// in same function
[]() {
const char*str=define_static_string("123");
std::vector<S> v;
v.push_back({str});
S s=define_static_array(v)[0];
std::vector<S> v2;
v2.push_back({s});
define_static_array(v);
}();
// raw pointer
[]() {
auto str=[]() {
const char*str=define_static_string("123");
std::vector<const char*> v;
v.push_back({str});
return define_static_array(v);
}()[0];
std::vector<const char*> v;
v.push_back({str});
return define_static_array(v);
}();
// raw pointer in inner function
[]() {
auto str=[]() {
const char*str=define_static_string("123");
std::vector<const char*> v;
v.push_back({str});
return define_static_array(v);
}()[0];
std::vector<S> v;
v.push_back({str});
return define_static_array(v);
}();
// raw pointer in outter function
[]() {
auto str=[]() {
const char*str=define_static_string("123");
std::vector<S> v;
v.push_back({str});
return define_static_array(v);
}()[0].str;
std::vector<const char*> v;
v.push_back({str});
return define_static_array(v);
}();
```