From 6c316c08d5bdea01d091399aab78250ddc460b76 Mon Sep 17 00:00:00 2001
From: Karl Williamson <khw@cpan.org>
Date: Sat, 3 Feb 2024 13:50:42 -0700
Subject: [PATCH 1/2] locale.c: Two loop indices are confined to an enum

They don't take on all possible unsigned values.  Create a macro to do
the casting necessary for some compilers
---
 locale.c | 8 ++++++--
 1 file changed, 6 insertions(+), 2 deletions(-)

diff --git a/locale.c b/locale.c
index 1c94217d1b7f..429171a3b76e 100644
--- a/locale.c
+++ b/locale.c
@@ -500,6 +500,10 @@ S_wsetlocale(const int category, const wchar_t * wlocale)
 #endif  /* WIN32_USE_FAKE_OLD_MINGW_LOCALES */
 
 /* 'for' loop headers to hide the necessary casts */
+#define for_category_indexes_between(i, m, n)                               \
+    for (locale_category_index i = (locale_category_index) (m);             \
+         i <= (locale_category_index) (n);                                  \
+         i = (locale_category_index) ((int) i + 1))
 #define for_all_individual_category_indexes(i)                              \
     for (locale_category_index i = (locale_category_index) 0;               \
          i < LC_ALL_INDEX_;                                                 \
@@ -3226,9 +3230,9 @@ S_find_locale_from_environment(pTHX_ const locale_category_index index)
     /* For each desired category, use any corresponding environment variable;
      * or the default if none such exists. */
     bool is_disparate = false;  /* Assume is uniform until proven otherwise */
-    for (unsigned i = lower; i <= upper; i++) {
+    for_category_indexes_between(i, lower, upper) {
         const char * const env_override = PerlEnv_getenv(category_names[i]);
-        unsigned int j = i - offset;
+        locale_category_index j = (locale_category_index) (i - offset);
 
         if (env_override && strNE(env_override, "")) {
             locale_names[j] = env_override;

From bc861f8b3e5281e063a0785717f6d0a3e9c68f30 Mon Sep 17 00:00:00 2001
From: Karl Williamson <khw@cpan.org>
Date: Mon, 5 Feb 2024 07:37:07 -0700
Subject: [PATCH 2/2] locale.c: Use macro created in previous commit

This is a more general macro than these others, which can be rewritten
more simply in terms of it.
---
 locale.c | 14 +++-----------
 1 file changed, 3 insertions(+), 11 deletions(-)

diff --git a/locale.c b/locale.c
index 429171a3b76e..ec3411351ace 100644
--- a/locale.c
+++ b/locale.c
@@ -505,19 +505,11 @@ S_wsetlocale(const int category, const wchar_t * wlocale)
          i <= (locale_category_index) (n);                                  \
          i = (locale_category_index) ((int) i + 1))
 #define for_all_individual_category_indexes(i)                              \
-    for (locale_category_index i = (locale_category_index) 0;               \
-         i < LC_ALL_INDEX_;                                                 \
-         i = (locale_category_index) ((int) i + 1))
-
+        for_category_indexes_between(i, 0, LC_ALL_INDEX_ - 1)
 #define for_all_but_0th_individual_category_indexes(i)                      \
-    for (locale_category_index i = (locale_category_index) 1;               \
-         i < LC_ALL_INDEX_;                                                 \
-         i = (locale_category_index) ((int) i + 1))
-
+        for_category_indexes_between(i, 1, LC_ALL_INDEX_ - 1)
 #define for_all_category_indexes(i)                                         \
-    for (locale_category_index i = (locale_category_index) 0;               \
-         i <= LC_ALL_INDEX_;                                                \
-         i = (locale_category_index) ((int) i + 1))
+        for_category_indexes_between(i, 0, LC_ALL_INDEX_)
 
 #ifdef USE_LOCALE
 #  if defined(USE_FAKE_LC_ALL_POSITIONAL_NOTATION) && defined(LC_ALL)