[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;