https://gcc.gnu.org/bugzilla/show_bug.cgi?id=122992
Xi Ruoyao <xry111 at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
CC| |xry111 at gcc dot gnu.org
--- Comment #25 from Xi Ruoyao <xry111 at gcc dot gnu.org> ---
I made up something to detect such an subtly invalid use of
EXECUTE_IF_SET_IN_HARD_REG_SET:
diff --git a/gcc/hard-reg-set.h b/gcc/hard-reg-set.h
index df56a3acedb..d5af9bbc281 100644
--- a/gcc/hard-reg-set.h
+++ b/gcc/hard-reg-set.h
@@ -401,10 +401,18 @@ hard_reg_set_iter_next (hard_reg_set_iterator *iter,
unsigned *)
iter->bits &= ~ HARD_CONST (1);
}
+template <typename T>
+inline void
+build_error_for_rvalue (T &&)
+{
+ static_assert(!std::is_rvalue_reference<T&&>::value);
+}
+
/* SET must not change throughout the iteration.
REGNUM (and ITER) may only be changed by the iteration functions. */
#define EXECUTE_IF_SET_IN_HARD_REG_SET(SET, MIN, REGNUM, ITER) \
- for (hard_reg_set_iter_init (&(ITER), (SET), (MIN), &(REGNUM)); \
+ for (build_error_for_rvalue (SET), \
+ hard_reg_set_iter_init (&(ITER), (SET), (MIN), &(REGNUM)); \
hard_reg_set_iter_set (&(ITER), &(REGNUM)); \
hard_reg_set_iter_next (&(ITER), &(REGNUM)))
The only issue detected is the one getting fixed by Drea above.