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);
}();
```
  • [Bug c++/124219] New: define_sta... chzn at mail dot ustc.edu.cn via Gcc-bugs

Reply via email to