https://gcc.gnu.org/bugzilla/show_bug.cgi?id=78493
Bug ID: 78493 Summary: profiledbootstrap failure: error: attempt to free a non-heap object 'names' in ../../gcc/cp/parser.c:11482:23 Product: gcc Version: unknown Status: UNCONFIRMED Severity: normal Priority: P3 Component: bootstrap Assignee: unassigned at gcc dot gnu.org Reporter: marxin at gcc dot gnu.org Target Milestone: --- I hit very interesting -Werror: In file included from ../../gcc/hash-table.h:236:0, from ../../gcc/coretypes.h:351, from ../../gcc/cp/parser.c:23: In static member function 'static void va_heap::release(vec<T, va_heap, vl_embed>*&) [with T = tree_node*]', inlined from 'void vec<T, va_heap, vl_ptr>::release() [with T = tree_node*]' at ../../gcc/vec.h:1497:3, inlined from 'auto_vec<T, N>::~auto_vec() [with T = tree_node*; long unsigned int N = 16ul]' at ../../gcc/vec.h:1275:5, inlined from 'tree_node* cp_parser_range_for(cp_parser*, tree, tree, tree, bool)' at ../../gcc/cp/parser.c:11482:23: ../../gcc/vec.h:307:3: error: attempt to free a non-heap object 'names' [-Werror=free-nonheap-object] ::free (v); ^~ Problem is that function cp_parser_range_for uses auto_vec <tree, 16> names; and as it only uses quick_push function, then m_vec == &m_auto: auto_vec () { m_auto.embedded_init (MAX (N, 2), 0, 1); this->m_vec = &m_auto; } and as ~auto_vec calls release: template<typename T> inline void vec<T, va_heap, vl_ptr>::release (void) { if (!m_vec) return; if (using_auto_storage ()) { m_vec->m_vecpfx.m_num = 0; return; } va_heap::release (m_vec); } Because of we probably can't prove that m_vec->m_vecpfx.m_using_auto_storage == 1, we end up with free (&names.m_auto); which is a dead code.