Make Unit types factories from float numbers be constexpr

std::isnan is not constexpr until c++23 and thus prevents constexpr construction from float numbers of unit types like DataRate
That check is not needed because is redundant with later check that value is convertable to int64_t

Bug: None
Change-Id: Ie8a06287492eb2122edf23fed63f1cd1bcd9df3d
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/355220
Auto-Submit: Danil Chapovalov <danilchap@webrtc.org>
Commit-Queue: Mirko Bonadei <mbonadei@webrtc.org>
Reviewed-by: Mirko Bonadei <mbonadei@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#42520}
diff --git a/rtc_base/units/unit_base.h b/rtc_base/units/unit_base.h
index a6bdbf5..fff6959 100644
--- a/rtc_base/units/unit_base.h
+++ b/rtc_base/units/unit_base.h
@@ -110,7 +110,6 @@
     } else if (value == -std::numeric_limits<T>::infinity()) {
       return MinusInfinity();
     } else {
-      RTC_DCHECK(!std::isnan(value));
       return FromValue(rtc::dchecked_cast<int64_t>(value));
     }
   }
diff --git a/rtc_base/units/unit_base_unittest.cc b/rtc_base/units/unit_base_unittest.cc
index 258d7d1..6003f4b 100644
--- a/rtc_base/units/unit_base_unittest.cc
+++ b/rtc_base/units/unit_base_unittest.cc
@@ -54,11 +54,19 @@
   constexpr TestUnit kTestUnitZero = TestUnit::Zero();
   constexpr TestUnit kTestUnitPlusInf = TestUnit::PlusInfinity();
   constexpr TestUnit kTestUnitMinusInf = TestUnit::MinusInfinity();
+
   static_assert(kTestUnitZero.IsZero(), "");
   static_assert(kTestUnitPlusInf.IsPlusInfinity(), "");
   static_assert(kTestUnitMinusInf.IsMinusInfinity(), "");
   static_assert(kTestUnitPlusInf.ToKiloOr(-1) == -1, "");
 
+  // Check FromValue is constexpr for floats.
+  static_assert(TestUnit::FromValue(0.0).IsZero());
+  static_assert(TestUnit::FromValue(INFINITY).IsPlusInfinity());
+  static_assert(TestUnit::FromValue(-INFINITY).IsMinusInfinity());
+  static_assert(TestUnit::FromValue(250.0) == TestUnit::FromValue(250));
+  static_assert(TestUnit::FromValue(-250.0) == TestUnit::FromValue(-250));
+
   static_assert(kTestUnitPlusInf > kTestUnitZero, "");
 
   constexpr TestUnit kTestUnitKilo = TestUnit::FromKilo(kValue);
@@ -69,6 +77,7 @@
   static_assert(TestUnitAddKilo(kTestUnitValue, 2).ToValue() == kValue + 2000,
                 "");
   static_assert(TestUnit::FromValue(500) / 2 == TestUnit::FromValue(250));
+  static_assert(TestUnit::FromValue(500.0) / 2 == TestUnit::FromValue(250.0));
 }
 
 TEST(UnitBaseTest, GetBackSameValues) {
@@ -223,6 +232,14 @@
   EXPECT_EQ(TestUnit::FromValue(-789) / 10, TestUnit::FromValue(-78));
 }
 
+#if GTEST_HAS_DEATH_TEST && RTC_DCHECK_IS_ON && !defined(WEBRTC_ANDROID)
+TEST(UnitBaseTest, CrashesWhenCreatedFromNan) {
+  EXPECT_DEATH(TestUnit::FromValue(NAN), "");
+  EXPECT_DEATH(TestUnit::FromValue(0.0 / 0.0), "");
+  EXPECT_DEATH(TestUnit::FromValue(INFINITY - INFINITY), "");
+}
+#endif
+
 TEST(UnitBaseTest, InfinityOperations) {
   const int64_t kValue = 267;
   const TestUnit finite = TestUnit::FromKilo(kValue);