[flang] Final fixes before review
Original-commit: flang-compiler/f18@efe5c1b8ec60f7c3d2a083da12924bc4523e6f72
Reviewed-on: https://github.com/flang-compiler/f18/pull/472
Tree-same-pre-rewrite: false
diff --git a/flang/lib/evaluate/fold.cc b/flang/lib/evaluate/fold.cc
index a99583b..a263e52 100644
--- a/flang/lib/evaluate/fold.cc
+++ b/flang/lib/evaluate/fold.cc
@@ -525,7 +525,13 @@
} else if (name == "radix") {
return Expr<T>{2};
} else if (name == "range") {
- if (const auto *cx{UnwrapExpr<Expr<SomeReal>>(args[0])}) {
+ if (const auto *cx{UnwrapExpr<Expr<SomeInteger>>(args[0])}) {
+ return Expr<T>{std::visit(
+ [](const auto &kx) {
+ return Scalar<ResultType<decltype(kx)>>::RANGE;
+ },
+ cx->u)};
+ } else if (const auto *cx{UnwrapExpr<Expr<SomeReal>>(args[0])}) {
return Expr<T>{std::visit(
[](const auto &kx) {
return Scalar<ResultType<decltype(kx)>>::RANGE;
diff --git a/flang/lib/evaluate/integer.h b/flang/lib/evaluate/integer.h
index d8b9b81..18db573 100644
--- a/flang/lib/evaluate/integer.h
+++ b/flang/lib/evaluate/integer.h
@@ -350,24 +350,10 @@
static constexpr Integer BIT_SIZE() { return {bits}; }
static constexpr Integer HUGE() { return MASKR(bits - 1); }
- static constexpr int Precision{// in the sense of SELECTED_INT_KIND
+ static constexpr int RANGE{// in the sense of SELECTED_INT_KIND
// This magic value is LOG10(2.)*1E12.
static_cast<int>(((bits - 1) * 301029995664) / 1000000000000)};
- // Returns the number of full decimal digits that can be represented.
- static constexpr int RANGE() {
- if (bits < 4) {
- return 0;
- }
- Integer x{HUGE()}, ten{10};
- int digits{0};
- while (x.CompareUnsigned(ten) != Ordering::Less) {
- ++digits;
- x = x.DivideUnsigned(ten).quotient;
- }
- return digits;
- }
-
constexpr bool IsZero() const {
for (int j{0}; j < parts; ++j) {
if (part_[j] != 0) {
diff --git a/flang/lib/evaluate/intrinsics.cc b/flang/lib/evaluate/intrinsics.cc
index 9bb95f2..fc4dce7 100644
--- a/flang/lib/evaluate/intrinsics.cc
+++ b/flang/lib/evaluate/intrinsics.cc
@@ -510,8 +510,8 @@
SameNumeric, Rank::dimReduced},
{"precision", {{"x", AnyFloating, Rank::anyOrAssumedRank}}, DefaultInt},
{"present", {{"a", Anything, Rank::anyOrAssumedRank}}, DefaultLogical},
- {"radix", {{"x", AnyFloating, Rank::anyOrAssumedRank}}, DefaultInt},
- {"range", {{"x", AnyFloating, Rank::anyOrAssumedRank}}, DefaultInt},
+ {"radix", {{"x", AnyNumeric, Rank::anyOrAssumedRank}}, DefaultInt},
+ {"range", {{"x", AnyNumeric, Rank::anyOrAssumedRank}}, DefaultInt},
{"rank", {{"a", Anything, Rank::anyOrAssumedRank}}, DefaultInt},
{"real", {{"a", AnyNumeric, Rank::elementalOrBOZ}, DefaultingKIND},
KINDReal},
diff --git a/flang/lib/evaluate/type.cc b/flang/lib/evaluate/type.cc
index fdb765a..ca40cfb 100644
--- a/flang/lib/evaluate/type.cc
+++ b/flang/lib/evaluate/type.cc
@@ -227,7 +227,7 @@
using Result = std::optional<int>;
using Types = IntegerTypes;
template<typename T> Result Test() const {
- if (Scalar<T>::Precision >= precision_) {
+ if (Scalar<T>::RANGE >= precision_) {
return T::kind;
} else {
return std::nullopt;