[RFC,v1,2/5] meson: Ignore `Wredundant-move` with GCC 11 and above
diff mbox series

Message ID 20260107193607.2168539-3-barnabas.pocze@ideasonboard.com
State New
Headers show
Series
  • C++20 migration
Related show

Commit Message

Barnabás Pőcze Jan. 7, 2026, 7:36 p.m. UTC
In C++20 mode, object slicing in a return statement triggers automatic move
since GCC 11, and using `std::move()` emits `-Wredundant-move` in those
same GCC versions. So disable the warning in those as well.

This is relevant for `valueOrTuple()` in `py_helpers.cpp`, which
returns a `py::tuple` as `py::object`.

Signed-off-by: Barnabás Pőcze <barnabas.pocze@ideasonboard.com>
---
 meson.build | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

Comments

Laurent Pinchart Jan. 7, 2026, 8:25 p.m. UTC | #1
Hi Barnabás,

Thank you for the patch.

On Wed, Jan 07, 2026 at 08:36:04PM +0100, Barnabás Pőcze wrote:
> In C++20 mode, object slicing in a return statement triggers automatic move
> since GCC 11, and using `std::move()` emits `-Wredundant-move` in those
> same GCC versions. So disable the warning in those as well.

Reading https://en.cppreference.com/w/cpp/language/return.html, do I
understand correctly that in C++20 the following clause stops applying,
and that's what causes the difference in behaviour due to the "formally"
part ?

  or it succeeded, but did not select the move constructor (formally,
  the first parameter of the selected constructor was not an rvalue
  reference to the (possibly cv-qualified) type of expression)

> This is relevant for `valueOrTuple()` in `py_helpers.cpp`, which
> returns a `py::tuple` as `py::object`.
> 
> Signed-off-by: Barnabás Pőcze <barnabas.pocze@ideasonboard.com>
> ---
>  meson.build | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
> 
> diff --git a/meson.build b/meson.build
> index 4aa7ecc96..1d8e1d994 100644
> --- a/meson.build
> +++ b/meson.build
> @@ -168,7 +168,7 @@ if cc.get_id() == 'gcc'
>      # disable the warning. With -Wpessimizing-move enabled, the compiler will
>      # still warn of pessimizing moves, only the redundant but not pessimizing
>      # moves will be ignored.

Expanding the context:

    # gcc 13 implements the C++23 version of automatic move from local
    # variables in return statements (see
    # https://en.cppreference.com/w/cpp/language/return). As a result, some
    # previously required explicit std::move() in return statements generate
    # warnings. Those moves can't be removed as older compiler versions could
    # use copy constructors instead of move constructors. The easiest fix is to
    # disable the warning. With -Wpessimizing-move enabled, the compiler will
    # still warn of pessimizing moves, only the redundant but not pessimizing
    # moves will be ignored.

This would look odd compared to the version check below. We can't just
s/13/11/ as that wouldn't be correct, so we probably need to list both
versions with their corresponding behaviour.

> -    if cc.version().version_compare('>=13')
> +    if cc.version().version_compare('>=11')
>          cpp_arguments += [
>              '-Wno-redundant-move',
>          ]
Barnabás Pőcze Jan. 8, 2026, 9:05 a.m. UTC | #2
2026. 01. 07. 21:25 keltezéssel, Laurent Pinchart írta:
> Hi Barnabás,
> 
> Thank you for the patch.
> 
> On Wed, Jan 07, 2026 at 08:36:04PM +0100, Barnabás Pőcze wrote:
>> In C++20 mode, object slicing in a return statement triggers automatic move
>> since GCC 11, and using `std::move()` emits `-Wredundant-move` in those
>> same GCC versions. So disable the warning in those as well.
> 
> Reading https://en.cppreference.com/w/cpp/language/return.html, do I
> understand correctly that in C++20 the following clause stops applying,
> and that's what causes the difference in behaviour due to the "formally"
> part ?
> 
>    or it succeeded, but did not select the move constructor (formally,
>    the first parameter of the selected constructor was not an rvalue
>    reference to the (possibly cv-qualified) type of expression)

I believe the relevant document is https://wg21.link/p1155r3#slicing


> 
>> This is relevant for `valueOrTuple()` in `py_helpers.cpp`, which
>> returns a `py::tuple` as `py::object`.
>>
>> Signed-off-by: Barnabás Pőcze <barnabas.pocze@ideasonboard.com>
>> ---
>>   meson.build | 2 +-
>>   1 file changed, 1 insertion(+), 1 deletion(-)
>>
>> diff --git a/meson.build b/meson.build
>> index 4aa7ecc96..1d8e1d994 100644
>> --- a/meson.build
>> +++ b/meson.build
>> @@ -168,7 +168,7 @@ if cc.get_id() == 'gcc'
>>       # disable the warning. With -Wpessimizing-move enabled, the compiler will
>>       # still warn of pessimizing moves, only the redundant but not pessimizing
>>       # moves will be ignored.
> 
> Expanding the context:
> 
>      # gcc 13 implements the C++23 version of automatic move from local
>      # variables in return statements (see
>      # https://en.cppreference.com/w/cpp/language/return). As a result, some
>      # previously required explicit std::move() in return statements generate
>      # warnings. Those moves can't be removed as older compiler versions could
>      # use copy constructors instead of move constructors. The easiest fix is to
>      # disable the warning. With -Wpessimizing-move enabled, the compiler will
>      # still warn of pessimizing moves, only the redundant but not pessimizing
>      # moves will be ignored.
> 
> This would look odd compared to the version check below. We can't just
> s/13/11/ as that wouldn't be correct, so we probably need to list both
> versions with their corresponding behaviour.

This is the behaviour of when object slicing in the return statement:

      -std=c++17       -std=c++20
   8:   move             move
   9:   copy             copy
  10:   copy             copy
  11:   copy             move
  12:   copy             move
  13:   move             move
  14:   move             move
  15:   move             move

Since GCC 8 is not supported. I think it is enough to just state that
since GCC 11 automatic move happens when the object is sliced, which
is I think the problematic case for libcamera.


> 
>> -    if cc.version().version_compare('>=13')
>> +    if cc.version().version_compare('>=11')
>>           cpp_arguments += [
>>               '-Wno-redundant-move',
>>           ]
>
Laurent Pinchart Jan. 9, 2026, 9:19 a.m. UTC | #3
On Thu, Jan 08, 2026 at 10:05:25AM +0100, Barnabás Pőcze wrote:
> 2026. 01. 07. 21:25 keltezéssel, Laurent Pinchart írta:
> > On Wed, Jan 07, 2026 at 08:36:04PM +0100, Barnabás Pőcze wrote:
> >> In C++20 mode, object slicing in a return statement triggers automatic move
> >> since GCC 11, and using `std::move()` emits `-Wredundant-move` in those
> >> same GCC versions. So disable the warning in those as well.
> > 
> > Reading https://en.cppreference.com/w/cpp/language/return.html, do I
> > understand correctly that in C++20 the following clause stops applying,
> > and that's what causes the difference in behaviour due to the "formally"
> > part ?
> > 
> >    or it succeeded, but did not select the move constructor (formally,
> >    the first parameter of the selected constructor was not an rvalue
> >    reference to the (possibly cv-qualified) type of expression)
> 
> I believe the relevant document is https://wg21.link/p1155r3#slicing

Thanks, that matches my understanding. It must be tough writing a
compiler, one needs a special mindset to adhere strictly to the spec
instead of interpreting it in an optimized way.

> >> This is relevant for `valueOrTuple()` in `py_helpers.cpp`, which
> >> returns a `py::tuple` as `py::object`.
> >>
> >> Signed-off-by: Barnabás Pőcze <barnabas.pocze@ideasonboard.com>
> >> ---
> >>   meson.build | 2 +-
> >>   1 file changed, 1 insertion(+), 1 deletion(-)
> >>
> >> diff --git a/meson.build b/meson.build
> >> index 4aa7ecc96..1d8e1d994 100644
> >> --- a/meson.build
> >> +++ b/meson.build
> >> @@ -168,7 +168,7 @@ if cc.get_id() == 'gcc'
> >>       # disable the warning. With -Wpessimizing-move enabled, the compiler will
> >>       # still warn of pessimizing moves, only the redundant but not pessimizing
> >>       # moves will be ignored.
> > 
> > Expanding the context:
> > 
> >      # gcc 13 implements the C++23 version of automatic move from local
> >      # variables in return statements (see
> >      # https://en.cppreference.com/w/cpp/language/return). As a result, some
> >      # previously required explicit std::move() in return statements generate
> >      # warnings. Those moves can't be removed as older compiler versions could
> >      # use copy constructors instead of move constructors. The easiest fix is to
> >      # disable the warning. With -Wpessimizing-move enabled, the compiler will
> >      # still warn of pessimizing moves, only the redundant but not pessimizing
> >      # moves will be ignored.
> > 
> > This would look odd compared to the version check below. We can't just
> > s/13/11/ as that wouldn't be correct, so we probably need to list both
> > versions with their corresponding behaviour.
> 
> This is the behaviour of when object slicing in the return statement:
> 
>       -std=c++17       -std=c++20
>    8:   move             move
>    9:   copy             copy
>   10:   copy             copy
>   11:   copy             move
>   12:   copy             move
>   13:   move             move
>   14:   move             move
>   15:   move             move
> 
> Since GCC 8 is not supported. I think it is enough to just state that
> since GCC 11 automatic move happens when the object is sliced, which
> is I think the problematic case for libcamera.

For the issue you're fixing here, yes, but we also have the current
issue that is separate and occurs with gcc <13. If we document the first
one only, we'll drop -Wno-redundant-move when dropping support for gcc
older than 11 and issues will occur with gcc older than 13. I suppose
they will be caught by CI though, so maybe it's OK?

> >> -    if cc.version().version_compare('>=13')
> >> +    if cc.version().version_compare('>=11')
> >>           cpp_arguments += [
> >>               '-Wno-redundant-move',
> >>           ]
Barnabás Pőcze Jan. 9, 2026, 10:32 a.m. UTC | #4
2026. 01. 09. 10:19 keltezéssel, Laurent Pinchart írta:
> On Thu, Jan 08, 2026 at 10:05:25AM +0100, Barnabás Pőcze wrote:
>> 2026. 01. 07. 21:25 keltezéssel, Laurent Pinchart írta:
>>> On Wed, Jan 07, 2026 at 08:36:04PM +0100, Barnabás Pőcze wrote:
>>>> In C++20 mode, object slicing in a return statement triggers automatic move
>>>> since GCC 11, and using `std::move()` emits `-Wredundant-move` in those
>>>> same GCC versions. So disable the warning in those as well.
>>>
>>> Reading https://en.cppreference.com/w/cpp/language/return.html, do I
>>> understand correctly that in C++20 the following clause stops applying,
>>> and that's what causes the difference in behaviour due to the "formally"
>>> part ?
>>>
>>>     or it succeeded, but did not select the move constructor (formally,
>>>     the first parameter of the selected constructor was not an rvalue
>>>     reference to the (possibly cv-qualified) type of expression)
>>
>> I believe the relevant document is https://wg21.link/p1155r3#slicing
> 
> Thanks, that matches my understanding. It must be tough writing a
> compiler, one needs a special mindset to adhere strictly to the spec
> instead of interpreting it in an optimized way.
> 
>>>> This is relevant for `valueOrTuple()` in `py_helpers.cpp`, which
>>>> returns a `py::tuple` as `py::object`.
>>>>
>>>> Signed-off-by: Barnabás Pőcze <barnabas.pocze@ideasonboard.com>
>>>> ---
>>>>    meson.build | 2 +-
>>>>    1 file changed, 1 insertion(+), 1 deletion(-)
>>>>
>>>> diff --git a/meson.build b/meson.build
>>>> index 4aa7ecc96..1d8e1d994 100644
>>>> --- a/meson.build
>>>> +++ b/meson.build
>>>> @@ -168,7 +168,7 @@ if cc.get_id() == 'gcc'
>>>>        # disable the warning. With -Wpessimizing-move enabled, the compiler will
>>>>        # still warn of pessimizing moves, only the redundant but not pessimizing
>>>>        # moves will be ignored.
>>>
>>> Expanding the context:
>>>
>>>       # gcc 13 implements the C++23 version of automatic move from local
>>>       # variables in return statements (see
>>>       # https://en.cppreference.com/w/cpp/language/return). As a result, some
>>>       # previously required explicit std::move() in return statements generate
>>>       # warnings. Those moves can't be removed as older compiler versions could
>>>       # use copy constructors instead of move constructors. The easiest fix is to
>>>       # disable the warning. With -Wpessimizing-move enabled, the compiler will
>>>       # still warn of pessimizing moves, only the redundant but not pessimizing
>>>       # moves will be ignored.
>>>
>>> This would look odd compared to the version check below. We can't just
>>> s/13/11/ as that wouldn't be correct, so we probably need to list both
>>> versions with their corresponding behaviour.
>>
>> This is the behaviour of when object slicing in the return statement:
>>
>>        -std=c++17       -std=c++20
>>     8:   move             move
>>     9:   copy             copy
>>    10:   copy             copy
>>    11:   copy             move
>>    12:   copy             move
>>    13:   move             move
>>    14:   move             move
>>    15:   move             move
>>
>> Since GCC 8 is not supported. I think it is enough to just state that
>> since GCC 11 automatic move happens when the object is sliced, which
>> is I think the problematic case for libcamera.
> 
> For the issue you're fixing here, yes, but we also have the current
> issue that is separate and occurs with gcc <13. If we document the first
> one only, we'll drop -Wno-redundant-move when dropping support for gcc
> older than 11 and issues will occur with gcc older than 13. I suppose
> they will be caught by CI though, so maybe it's OK?

Sorry, it seems I am confused. As far as I'm aware this warning is only disabled
because of py_helpers.cpp:valueOrTuple(), which does object slicing in its return
statement. So as soon as the minimum supported gcc version becomes 13 or 11, respectively,
this warning can be enabled, and the redundant move can be removed. And everything
should work, no?



> 
>>>> -    if cc.version().version_compare('>=13')
>>>> +    if cc.version().version_compare('>=11')
>>>>            cpp_arguments += [
>>>>                '-Wno-redundant-move',
>>>>            ]
>

Patch
diff mbox series

diff --git a/meson.build b/meson.build
index 4aa7ecc96..1d8e1d994 100644
--- a/meson.build
+++ b/meson.build
@@ -168,7 +168,7 @@  if cc.get_id() == 'gcc'
     # disable the warning. With -Wpessimizing-move enabled, the compiler will
     # still warn of pessimizing moves, only the redundant but not pessimizing
     # moves will be ignored.
-    if cc.version().version_compare('>=13')
+    if cc.version().version_compare('>=11')
         cpp_arguments += [
             '-Wno-redundant-move',
         ]