[Mesa-dev] [PATCH] r600/sb: cleanup if_conversion iterator to be legal C++

Mathias Fröhlich Mathias.Froehlich at gmx.net
Fri Jun 29 06:05:05 UTC 2018


Hi,

On Friday, 29 June 2018 04:49:42 CEST Dave Airlie wrote:
> From: Dave Airlie <airlied at redhat.com>
> 
> The current code causes:
> /usr/include/c++/8/debug/safe_iterator.h:207:
> Error: attempt to copy from a singular iterator.
> 
> This is due to the iterators getting invalidated, fix the
> reverse iterator to use the return value from erase, and
> cast it properly.

Looks correct.

One thing inline below:

> 
> Cc: <mesa-stable at lists.freedesktop.org>
> ---
>  src/gallium/drivers/r600/sb/sb_if_conversion.cpp | 11 ++++-------
>  1 file changed, 4 insertions(+), 7 deletions(-)
> 
> diff --git a/src/gallium/drivers/r600/sb/sb_if_conversion.cpp b/src/gallium/drivers/r600/sb/sb_if_conversion.cpp
> index 3f6431b80f5..5556531f145 100644
> --- a/src/gallium/drivers/r600/sb/sb_if_conversion.cpp
> +++ b/src/gallium/drivers/r600/sb/sb_if_conversion.cpp
> @@ -42,16 +42,13 @@ int if_conversion::run() {
>  	regions_vec &rv = sh.get_regions();
>  
>  	unsigned converted = 0;
> -
> -	for (regions_vec::reverse_iterator N, I = rv.rbegin(), E = rv.rend();
> -			I != E; I = N) {
> -		N = I; ++N;
> -
> +	for (regions_vec::reverse_iterator I = rv.rbegin(); I != rv.rend(); ) {
>  		region_node *r = *I;
>  		if (run_on(r)) {
> -			rv.erase(I.base() - 1);
> +			I = decltype(I){rv.erase(std::next(I).base())};


I don't exactly know for mesa, do we already generally and strictly
require c++11?

If c++11 is not strictly available, you may instead of the above write

I = regions_vec::reverse_iterator(rv.erase((++I).base()));

without loss.

In any case:

Reviewed-by: Mathias Fröhlich <mathias.froehlich at web.de>

best

Mathias

>  			++converted;
> -		}
> +		} else
> +			++I;
>  	}
>  	return 0;
>  }
> 





More information about the mesa-dev mailing list