https://gcc.gnu.org/bugzilla/show_bug.cgi?id=122197
Bug ID: 122197
Summary: [16 Regression] predictively devrutualizationd vs
middle-end warnings
Product: gcc
Version: 16.0
Status: UNCONFIRMED
Keywords: diagnostic
Severity: normal
Priority: P3
Component: tree-optimization
Assignee: unassigned at gcc dot gnu.org
Reporter: pinskia at gcc dot gnu.org
Target Milestone: ---
Created attachment 62520
--> https://gcc.gnu.org/bugzilla/attachment.cgi?id=62520&action=edit
testcase
Compile the attached at `-std=c++11 -O3 -W -Wall` and you get:
```
In file included from
/cefs/45/45c5afc913eb622614d0a33a_arm64_gcc-trunk-20251007/aarch64-unknown-linux-gnu/aarch64-unknown-linux-gnu/include/c++/16.0.0/bits/shared_ptr.h:53,
from
/cefs/45/45c5afc913eb622614d0a33a_arm64_gcc-trunk-20251007/aarch64-unknown-linux-gnu/aarch64-unknown-linux-gnu/include/c++/16.0.0/memory:82,
from <source>:1:
In destructor 'std::_Sp_counted_deleter<_Ptr, _Deleter, _Alloc,
_Lp>::~_Sp_counted_deleter() [with _Ptr = X*; _Deleter =
std::default_delete<X>; _Alloc = std::allocator<void>; __gnu_cxx::_Lock_policy
_Lp = __gnu_cxx::_S_atomic]',
inlined from 'void std::_Sp_counted_base<_Lp>::_M_destroy() [with
__gnu_cxx::_Lock_policy _Lp = __gnu_cxx::_S_atomic]' at
/cefs/45/45c5afc913eb622614d0a33a_arm64_gcc-trunk-20251007/aarch64-unknown-linux-gnu/aarch64-unknown-linux-gnu/include/c++/16.0.0/bits/shared_ptr_base.h:143:9,
inlined from 'void std::_Sp_counted_base<_Lp>::_M_release() [with
__gnu_cxx::_Lock_policy _Lp = __gnu_cxx::_S_atomic]' at
/cefs/45/45c5afc913eb622614d0a33a_arm64_gcc-trunk-20251007/aarch64-unknown-linux-gnu/aarch64-unknown-linux-gnu/include/c++/16.0.0/bits/shared_ptr_base.h:418:18,
inlined from 'void std::_Sp_counted_base<_Lp>::_M_release() [with
__gnu_cxx::_Lock_policy _Lp = __gnu_cxx::_S_atomic]' at
/cefs/45/45c5afc913eb622614d0a33a_arm64_gcc-trunk-20251007/aarch64-unknown-linux-gnu/aarch64-unknown-linux-gnu/include/c++/16.0.0/bits/shared_ptr_base.h:386:5,
inlined from 'std::__shared_count<_Lp>::~__shared_count() [with
__gnu_cxx::_Lock_policy _Lp = __gnu_cxx::_S_atomic]' at
/cefs/45/45c5afc913eb622614d0a33a_arm64_gcc-trunk-20251007/aarch64-unknown-linux-gnu/aarch64-unknown-linux-gnu/include/c++/16.0.0/bits/shared_ptr_base.h:1123:21,
inlined from 'std::__shared_ptr<_Tp,
_Lp>::__shared_ptr(std::unique_ptr<_Up, _Ep>&&) [with _Yp = X; _Del =
std::default_delete<X>; <template-parameter-2-3> = void; _Tp = X;
__gnu_cxx::_Lock_policy _Lp = __gnu_cxx::_S_atomic]' at
/cefs/45/45c5afc913eb622614d0a33a_arm64_gcc-trunk-20251007/aarch64-unknown-linux-gnu/aarch64-unknown-linux-gnu/include/c++/16.0.0/bits/shared_ptr_base.h:1635:18,
inlined from 'std::shared_ptr<_Tp>::shared_ptr(std::unique_ptr<_Up, _Ep>&&)
[with _Yp = X; _Del = std::default_delete<X>; <template-parameter-2-3> = void;
_Tp = X]' at
/cefs/45/45c5afc913eb622614d0a33a_arm64_gcc-trunk-20251007/aarch64-unknown-linux-gnu/aarch64-unknown-linux-gnu/include/c++/16.0.0/bits/shared_ptr.h:395:36,
inlined from 'void ffff()' at <source>:376:51:
/cefs/45/45c5afc913eb622614d0a33a_arm64_gcc-trunk-20251007/aarch64-unknown-linux-gnu/aarch64-unknown-linux-gnu/include/c++/16.0.0/bits/shared_ptr_base.h:576:41:
warning: 'void operator delete(void*)' called on unallocated object
'std::allocator<std::_Sp_counted_deleter<X*, std::default_delete<X>,
std::allocator<void>, __gnu_cxx::_S_atomic> >::storage' [-Wfree-nonheap-object]
576 | ~_Sp_counted_deleter() noexcept { }
| ^
<source>: In function 'void ffff()':
<source>:370:8: note: declared here
370 | char allocator<spcd>::storage[];
| ^~~~~~~~~~~~~~~
In destructor 'std::_Sp_counted_deleter<_Ptr, _Deleter, _Alloc,
_Lp>::~_Sp_counted_deleter() [with _Ptr = X*; _Deleter =
std::default_delete<X>; _Alloc = std::allocator<void>; __gnu_cxx::_Lock_policy
_Lp = __gnu_cxx::_S_atomic]',
inlined from 'void std::_Sp_counted_base<_Lp>::_M_destroy() [with
__gnu_cxx::_Lock_policy _Lp = __gnu_cxx::_S_atomic]' at
/cefs/45/45c5afc913eb622614d0a33a_arm64_gcc-trunk-20251007/aarch64-unknown-linux-gnu/aarch64-unknown-linux-gnu/include/c++/16.0.0/bits/shared_ptr_base.h:143:9,
inlined from 'void std::_Sp_counted_base<_Lp>::_M_release() [with
__gnu_cxx::_Lock_policy _Lp = __gnu_cxx::_S_atomic]' at
/cefs/45/45c5afc913eb622614d0a33a_arm64_gcc-trunk-20251007/aarch64-unknown-linux-gnu/aarch64-unknown-linux-gnu/include/c++/16.0.0/bits/shared_ptr_base.h:418:18,
inlined from 'void std::_Sp_counted_base<_Lp>::_M_release() [with
__gnu_cxx::_Lock_policy _Lp = __gnu_cxx::_S_atomic]' at
/cefs/45/45c5afc913eb622614d0a33a_arm64_gcc-trunk-20251007/aarch64-unknown-linux-gnu/aarch64-unknown-linux-gnu/include/c++/16.0.0/bits/shared_ptr_base.h:386:5,
inlined from 'std::__shared_count<_Lp>::~__shared_count() [with
__gnu_cxx::_Lock_policy _Lp = __gnu_cxx::_S_atomic]' at
/cefs/45/45c5afc913eb622614d0a33a_arm64_gcc-trunk-20251007/aarch64-unknown-linux-gnu/aarch64-unknown-linux-gnu/include/c++/16.0.0/bits/shared_ptr_base.h:1123:21,
inlined from 'std::__shared_ptr<_Tp, _Lp>::~__shared_ptr() [with _Tp = X;
__gnu_cxx::_Lock_policy _Lp = __gnu_cxx::_S_atomic]' at
/cefs/45/45c5afc913eb622614d0a33a_arm64_gcc-trunk-20251007/aarch64-unknown-linux-gnu/aarch64-unknown-linux-gnu/include/c++/16.0.0/bits/shared_ptr_base.h:1597:7,
inlined from 'void std::__shared_ptr<_Tp, _Lp>::reset() [with _Tp = X;
__gnu_cxx::_Lock_policy _Lp = __gnu_cxx::_S_atomic]' at
/cefs/45/45c5afc913eb622614d0a33a_arm64_gcc-trunk-20251007/aarch64-unknown-linux-gnu/aarch64-unknown-linux-gnu/include/c++/16.0.0/bits/shared_ptr_base.h:1715:9,
inlined from 'void ffff()' at <source>:378:10:
/cefs/45/45c5afc913eb622614d0a33a_arm64_gcc-trunk-20251007/aarch64-unknown-linux-gnu/aarch64-unknown-linux-gnu/include/c++/16.0.0/bits/shared_ptr_base.h:576:41:
warning: 'void operator delete(void*)' called on unallocated object
'std::allocator<std::_Sp_counted_deleter<X*, std::default_delete<X>,
std::allocator<void>, __gnu_cxx::_S_atomic> >::storage' [-Wfree-nonheap-object]
576 | ~_Sp_counted_deleter() noexcept { }
| ^
<source>: In function 'void ffff()':
<source>:370:8: note: declared here
370 | char allocator<spcd>::storage[];
| ^~~~~~~~~~~~~~~
```
The problem is GCC speculating devirtualized for a few virtual function calls
but since we (incorrectly though harmless since there is a check before going
down that path) devirtualize to a virtual function which is not reached, we get
warnings now down that path.