On Tue, Jan 27, 2026 at 7:13 PM Jonathan Wakely <[email protected]> wrote:
> Speculative devirtualization in GCC 16 causes some false positive
> warnings for unreachable paths. Use diagnostic pragmas to suppress
> those warnings until the regression is fixed.
>
> libstdc++-v3/ChangeLog:
>
> PR tree-optimization/122197
> * include/bits/shared_ptr_base.h (~_Sp_counted_deleter): Use
> diagnostic pragam to disable -Wfree-nonheap-object false
> positive.
> (~_Sp_counted_ptr_inplace): Likewise for -Warray-bounds false
> positive.
> ---
>
> Tested x86_64-linux and aarch64-linux.
LGTM.
I saw the warnings locally, and also reached the conclusion that there
are false-positives. I was looking into addressing the warning without
pragmas, but haven't found a way to do it yet. So let not perfect be enemy
of good.
>
> libstdc++-v3/include/bits/shared_ptr_base.h | 7 +++++++
> 1 file changed, 7 insertions(+)
>
> diff --git a/libstdc++-v3/include/bits/shared_ptr_base.h
> b/libstdc++-v3/include/bits/shared_ptr_base.h
> index 88e0f4d58c6c..b92e3a4c90e4 100644
> --- a/libstdc++-v3/include/bits/shared_ptr_base.h
> +++ b/libstdc++-v3/include/bits/shared_ptr_base.h
> @@ -579,7 +579,11 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
> _Sp_counted_deleter(_Ptr __p, _Deleter __d, const _Alloc& __a)
> noexcept
> : _M_impl(__p, std::move(__d), __a) { }
>
> +#pragma GCC diagnostic push // PR tree-optimization/122197
> +#pragma GCC diagnostic ignored "-Wfree-nonheap-object"
> + template<typename> class auto_ptr;
> ~_Sp_counted_deleter() noexcept { }
> +#pragma GCC diagnostic pop
>
> virtual void
> _M_dispose() noexcept
> @@ -667,7 +671,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
> std::forward<_Args>(__args)...); // might throw
> }
>
> +#pragma GCC diagnostic push // PR tree-optimization/122197
> +#pragma GCC diagnostic ignored "-Warray-bounds"
> ~_Sp_counted_ptr_inplace() noexcept { }
> +#pragma GCC diagnostic pop
>
> virtual void
> _M_dispose() noexcept
> --
> 2.52.0
>
>