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.

Reply via email to