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

Giuseppe D'Angelo <dangelog at gmail dot com> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |dangelog at gmail dot com

--- Comment #8 from Giuseppe D'Angelo <dangelog at gmail dot com> ---
Hi,

GCC 15 seems to be emitting the C++20 compatibility warning even when a
structured binding is used in an init-capture's initializer, not just in a
simple-capture:

https://gcc.godbolt.org/z/TnzWs8xne

int main()
{
    int a[] = { 42 };

    auto [x] = a;

    [x](){}; // 1
    [x=x](){}; // 2
    [test = x](){}; // 3
    [test = x * 2](){}; // 4
}

> <source>: In function 'int main()':
> <source>:7:6: warning: captured structured bindings are a C++20 extension 
> [-Wc++20-extensions]
>     7 |     [x](){}; // 1
>       |      ^
> <source>:5:11: note: declared here
>     5 |     auto [x] = a;
>       |           ^
> <source>:8:8: warning: captured structured bindings are a C++20 extension 
> [-Wc++20-extensions]
>     8 |     [x=x](){}; // 2
>       |        ^
> <source>:5:11: note: declared here
>     5 |     auto [x] = a;
>       |           ^
> <source>:9:13: warning: captured structured bindings are a C++20 extension 
> [-Wc++20-extensions]
>     9 |     [test = x](){}; // 3
>       |             ^
> <source>:5:11: note: declared here
>     5 |     auto [x] = a;
>       |           ^
> Compiler returned: 0


(1) is OK, but (2) and (3) shouldn't warn. (4) doesn't warn.

AFAICS, the code should be fine, as init-captures don't impose anything here?

* In C++17 (N4659), [expr.prim.lambda.capture]/6: "An init-capture behaves as
if it declares and explicitly captures a variable of the form “auto
init-capture ;” whose declarative region is the lambda-expression's
compound-statement"
(https://timsong-cpp.github.io/cppwp/n4659/expr.prim.lambda.capture#6)

* The current draft says: "An init-capture without ellipsis behaves as if it
declares and explicitly captures a variable of the form “auto init-capture ;”"
(https://eel.is/c++draft/expr.prim.lambda.capture#6)

For comparison, Clang doesn't warn.

Reply via email to