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)

Reply via email to