[flang] Add message formatting for std::int64_t

There is no printf formatting string for std::int64_t. Instead we have
to cast to std::intmax_t and use `%jd`. This change simplifies that by
automatically converting std::int64_t to std::intmax_t when formatting
messages.

Original-commit: flang-compiler/f18@8a2343dfffc9ccb04bdfe4c16ca47128255d47bd
Reviewed-on: https://github.com/flang-compiler/f18/pull/1101
Tree-same-pre-rewrite: false
diff --git a/flang/include/flang/Parser/message.h b/flang/include/flang/Parser/message.h
index bc2eed0..784989e 100644
--- a/flang/include/flang/Parser/message.h
+++ b/flang/include/flang/Parser/message.h
@@ -100,6 +100,7 @@
   const char *Convert(std::string &);
   const char *Convert(std::string &&);
   const char *Convert(CharBlock);
+  std::intmax_t Convert(std::int64_t x) { return x; }
 
   bool isFatal_{false};
   std::string string_;
diff --git a/flang/lib/Evaluate/fold-implementation.h b/flang/lib/Evaluate/fold-implementation.h
index 44f0093..3b1a314 100644
--- a/flang/lib/Evaluate/fold-implementation.h
+++ b/flang/lib/Evaluate/fold-implementation.h
@@ -275,7 +275,7 @@
       if (at[j] < lbounds[j] || at[j] >= lbounds[j] + shape[j]) {
         context_.messages().Say(
             "Subscript value (%jd) is out of range on dimension %d in reference to a constant array value"_err_en_US,
-            static_cast<std::intmax_t>(at[j]), j + 1);
+            at[j], j + 1);
         return std::nullopt;
       }
     }
diff --git a/flang/lib/Evaluate/fold-integer.cpp b/flang/lib/Evaluate/fold-integer.cpp
index 6d159eda..fa4c8b0 100644
--- a/flang/lib/Evaluate/fold-integer.cpp
+++ b/flang/lib/Evaluate/fold-integer.cpp
@@ -24,7 +24,7 @@
           if (*dim64 < 1 || *dim64 > rank) {
             context.messages().Say("DIM=%jd dimension is out of range for "
                                    "rank-%d array"_en_US,
-                static_cast<std::intmax_t>(*dim64), rank);
+                *dim64, rank);
             return MakeInvalidIntrinsic<T>(std::move(funcRef));
           } else {
             dim = *dim64 - 1; // 1-based to 0-based
@@ -79,7 +79,7 @@
           if (*dim64 < 1 || *dim64 > rank) {
             context.messages().Say("DIM=%jd dimension is out of range for "
                                    "rank-%d array"_en_US,
-                static_cast<std::intmax_t>(*dim64), rank);
+                *dim64, rank);
             return MakeInvalidIntrinsic<T>(std::move(funcRef));
           } else {
             dim = *dim64 - 1; // 1-based to 0-based
@@ -572,7 +572,7 @@
           } else {
             context.messages().Say(
                 "size(array,dim=%jd) dimension is out of range for rank-%d array"_en_US,
-                static_cast<std::intmax_t>(*dim), static_cast<int>(rank));
+                *dim, rank);
           }
         }
       } else if (auto extents{common::AllElementsPresent(std::move(*shape))}) {
diff --git a/flang/lib/Evaluate/shape.cpp b/flang/lib/Evaluate/shape.cpp
index 7d33a8b..9cf684b 100644
--- a/flang/lib/Evaluate/shape.cpp
+++ b/flang/lib/Evaluate/shape.cpp
@@ -642,8 +642,7 @@
             if (*leftDim != *rightDim) {
               messages.Say("Dimension %1$d of %2$s has extent %3$jd, "
                            "but %4$s has extent %5$jd"_err_en_US,
-                  j + 1, leftIs, static_cast<std::intmax_t>(*leftDim), rightIs,
-                  static_cast<std::intmax_t>(*rightDim));
+                  j + 1, leftIs, *leftDim, rightIs, *rightDim);
               return false;
             }
           }
diff --git a/flang/lib/Evaluate/variable.cpp b/flang/lib/Evaluate/variable.cpp
index 3ebd68a..36bfee2 100644
--- a/flang/lib/Evaluate/variable.cpp
+++ b/flang/lib/Evaluate/variable.cpp
@@ -168,8 +168,7 @@
   std::optional<ConstantSubscript> lbi{ToInt64(lower_.value().value())};
   if (lbi && *lbi < 1) {
     context.messages().Say(
-        "Lower bound (%jd) on substring is less than one"_en_US,
-        static_cast<std::intmax_t>(*lbi));
+        "Lower bound (%jd) on substring is less than one"_en_US, *lbi);
     *lbi = 1;
     lower_ = AsExpr(Constant<SubscriptInteger>{1});
   }
@@ -200,8 +199,7 @@
     } else if (length && *ubi > *length) {
       context.messages().Say("Upper bound (%jd) on substring is greater "
                              "than character length (%jd)"_en_US,
-          static_cast<std::intmax_t>(*ubi),
-          static_cast<std::intmax_t>(*length));
+          *ubi, *length);
       *ubi = *length;
     }
     if (lbi && literal) {
diff --git a/flang/lib/Semantics/assignment.cpp b/flang/lib/Semantics/assignment.cpp
index 3e74f86..657e618 100644
--- a/flang/lib/Semantics/assignment.cpp
+++ b/flang/lib/Semantics/assignment.cpp
@@ -242,7 +242,7 @@
           Say(at,
               "Dimension %d must have extent %jd to match prior mask or"
               " assignment of WHERE construct"_err_en_US,
-              i + 1, static_cast<std::intmax_t>(*whereExtents_[i]));
+              i + 1, *whereExtents_[i]);
         }
       }
     }
diff --git a/flang/lib/Semantics/check-io.cpp b/flang/lib/Semantics/check-io.cpp
index 0e447bc..a1305ae 100644
--- a/flang/lib/Semantics/check-io.cpp
+++ b/flang/lib/Semantics/check-io.cpp
@@ -166,7 +166,7 @@
     if (*recl <= 0) {
       context_.Say(parser::FindSourceLocation(spec),
           "RECL value (%jd) must be positive"_err_en_US,
-          std::move(static_cast<std::intmax_t>(*recl))); // 12.5.6.15
+          *recl); // 12.5.6.15
     }
   }
 }
diff --git a/flang/lib/Semantics/resolve-names.cpp b/flang/lib/Semantics/resolve-names.cpp
index 7828d69..6417a82 100644
--- a/flang/lib/Semantics/resolve-names.cpp
+++ b/flang/lib/Semantics/resolve-names.cpp
@@ -3510,8 +3510,7 @@
       !evaluate::IsValidKindOfIntrinsicType(
           TypeCategory::Character, *intKind)) { // C715, C719
     Say(currStmtSource().value(),
-        "KIND value (%jd) not valid for CHARACTER"_err_en_US,
-        static_cast<std::intmax_t>(*intKind));
+        "KIND value (%jd) not valid for CHARACTER"_err_en_US, *intKind);
   }
   if (x.length) {
     charInfo_.length = GetParamValue(*x.length, common::TypeParamAttr::Len);
diff --git a/flang/lib/Semantics/symbol.cpp b/flang/lib/Semantics/symbol.cpp
index e48b7b95..c80b669 100644
--- a/flang/lib/Semantics/symbol.cpp
+++ b/flang/lib/Semantics/symbol.cpp
@@ -571,7 +571,7 @@
       foldingContext.messages().Say(
           "KIND parameter value (%jd) of intrinsic type %s "
           "did not resolve to a supported value"_err_en_US,
-          static_cast<std::intmax_t>(*value),
+          *value,
           parser::ToUpperCaseLetters(
               common::EnumToString(intrinsic.category())));
     }