On Wed, 20 Nov 2019, Jan Hubicka wrote: > Hi, > sadly this patch seems to trigger false positive > ../../gcc/vec.h:311:10: error: attempt to free a non-heap object ???@Xa???@Y > [-Werror=free-nonheap-object] > > which is about vec destructor freeing heap allocated memory if the > vector was ever resized from hits stack allocated place. In this case > it never is. > > I am testing the following workaround which turns it into simple array > (only benefit of auto_vec here is the bounds check that I implemented by > hand). > > I will commit it once x86_64-linux boostrap finishes unless someone > comes with better alternative. Sorry for this - it did not show up with > LTO build for me.
I've committed a workaround for a similar issue to vec.h, so you might want to re-check. Richard. > Honza > > * fibonacci_heap.h (fibonacci_heap<K,V>::consolidate): Turn auto_vec > to ordinary array. > > Index: fibonacci_heap.h > =================================================================== > --- fibonacci_heap.h (revision 278501) > +++ fibonacci_heap.h (working copy) > @@ -648,17 +648,18 @@ template<class K, class V> > void fibonacci_heap<K,V>::consolidate () > { > const int D = 1 + 8 * sizeof (long); > - auto_vec<fibonacci_node<K,V> *, D> a; > + fibonacci_node<K,V> *a[D]; > fibonacci_node<K,V> *w, *x, *y; > int i, d; > > - a.quick_grow_cleared (D); > + memset (a, 0, sizeof (a)); > > while ((w = m_root) != NULL) > { > x = w; > remove_root (w); > d = x->m_degree; > + gcc_checking_assert (d < D); > while (a[d] != NULL) > { > y = a[d]; > -- Richard Biener <rguent...@suse.de> SUSE Software Solutions Germany GmbH, Maxfeldstrasse 5, 90409 Nuernberg, Germany; GF: Felix Imendörffer; HRB 36809 (AG Nuernberg)