[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())));
}