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

Dave Airlie airlied at gmail.com
Fri Jun 29 02:49:42 UTC 2018


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.

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())};
 			++converted;
-		}
+		} else
+			++I;
 	}
 	return 0;
 }
-- 
2.17.1



More information about the mesa-dev mailing list