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.

Reply via email to