https://gcc.gnu.org/bugzilla/show_bug.cgi?id=106238
Bug ID: 106238 Summary: Inline optimization causes dangling pointer on "include/c++/12.1.0/bits/stl_tree.h" Product: gcc Version: 12.1.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: libstdc++ Assignee: unassigned at gcc dot gnu.org Reporter: rogerio.souza at gmail dot com Target Milestone: --- Created attachment 53282 --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=53282&action=edit Preprocessed file to reroduce the issue When compiling the code below, we get a dangling pointer warning. ==================================================================== #include <map> struct sysDLoc { /* Coordinates (in DBU) */ double x, y; }; std::map<int*, sysDLoc> static_copy; void realSwap() { std::map<int*, sysDLoc> local_copy; extern void getLocalCopy(std::map<int*, sysDLoc>&); getLocalCopy(local_copy); local_copy.swap(static_copy); } ==================================================================== Compilation command: g++ -Wdangling-pointer -c -O2 bug.cpp Warning log: In file included from /grid/common/test/gcc-v12.1.0d2rh74_lnx86/include/c++/12.1.0/map:60, from bug.cpp:1: In member function 'void std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::swap(std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>&) [with _Key = int*; _Val = std::pair<int* const, sysDLoc>; _KeyOfValue = std::_Select1st<std::pair<int* const, sysDLoc> >; _Compare = std::less<int*>; _Alloc = std::allocator<std::pair<int* const, sysDLoc> >]', inlined from 'void std::map<_Key, _Tp, _Compare, _Alloc>::swap(std::map<_Key, _Tp, _Compare, _Alloc>&) [with _Key = int*; _Tp = sysDLoc; _Compare = std::less<int*>; _Alloc = std::allocator<std::pair<int* const, sysDLoc> >]' at /grid/common/test/gcc-v12.1.0d2rh74_lnx86/include/c++/12.1.0/bits/stl_map.h:1172:18, inlined from 'void realSwap()' at bug.cpp:14:18: /grid/common/test/gcc-v12.1.0d2rh74_lnx86/include/c++/12.1.0/bits/stl_tree.h:2090:32: warning: storing the address of local variable 'local_copy' in '*MEM[(struct _Rb_tree_node_base * &)&local_copy + 16].std::_Rb_tree_node_base::_M_paren ' [-Wdangling-pointer=] 2090 | _M_root()->_M_parent = _M_end(); | ~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~ bug.cpp: In function 'void realSwap()': bug.cpp:11:27: note: 'local_copy' declared here 11 | std::map<int*, sysDLoc> local_copy; | ^~~~~~~~~~ bug.cpp:11:27: note: 'local_copy.std::map<int*, sysDLoc, std::less<int*>, std::allocator<std::pair<int* const, sysDLoc> > >::_M_t.std::_Rb_tree<int*, std::pair<int* const, sysDLoc>, std::_Select1st<std::pair<int* const, sysDLoc> >, std::less<int*>, std::allocator<std::pair<int* const, sysDLoc> > >::_M_impl.std::_Rb_tree<int*, std::pair<int* const, sysDLoc>, std::_Select1st<std::pair<int* const, sysDLoc> >, std::less<int*>, std::allocator<std::pair<int* const, sysDLoc> > >::_Rb_tree_impl<std::less<int*>, true>::<unnamed>.std::_Rb_tree_header::_M_header.std::_Rb_tree_node_base::_M_parent' declared here This warning only happens on GCC v12.1. Using -O1, "-fno-inline-small-functions”, or “-fno-inline-functions” prevents the error from happening. Regards, Rogerio