Change abseil hardening assertions in types directory from macros to functions

This associates debug information with the assertion sites, allowing clearer stack-traces for assertion failures and better accounting of the performance overhead of assertions.

This change also changes the assertion functions from inline to constexpr, to allow functions using them to be called from static assertions (like optional_ref::operator* in optional_ref's constexpr test).

PiperOrigin-RevId: 903344377
Change-Id: I50166b6cf12a8f139ed3c9fe4f6c6e0f24b51812
diff --git a/absl/base/internal/hardening.h b/absl/base/internal/hardening.h
index 6ea2833..31638a4 100644
--- a/absl/base/internal/hardening.h
+++ b/absl/base/internal/hardening.h
@@ -52,7 +52,7 @@
 // Prefer a more specific assertion function over this more general one,
 // as assertion functions which perform the comparison themselves
 // can have the cost of the comparison attributed to them.
-constexpr void HardeningAssert(bool cond) {
+inline void HardeningAssert(bool cond) {
   ABSL_ASSERT(cond);
 #if (ABSL_OPTION_HARDENED == 1 || ABSL_OPTION_HARDENED == 2) && defined(NDEBUG)
   if (ABSL_PREDICT_FALSE(!cond)) {
@@ -66,7 +66,7 @@
 //
 // When `NDEBUG` is not defined, `HardeningAssertSlow`'s behavior is identical
 // to `ABSL_ASSERT`.
-constexpr void HardeningAssertSlow(bool cond) {
+inline void HardeningAssertSlow(bool cond) {
   ABSL_ASSERT(cond);
 #if (ABSL_OPTION_HARDENED == 1) && defined(NDEBUG)
   if (ABSL_PREDICT_FALSE(!cond)) {
@@ -76,7 +76,7 @@
 }
 
 template <typename T>
-constexpr void HardeningAssertGT(T val1, T val2) {
+inline void HardeningAssertGT(T val1, T val2) {
   ABSL_ASSERT(val1 > val2);
 #if (ABSL_OPTION_HARDENED == 1 || ABSL_OPTION_HARDENED == 2) && defined(NDEBUG)
   if (!ABSL_PREDICT_TRUE(val1 > val2)) {
@@ -86,7 +86,7 @@
 }
 
 template <typename T>
-constexpr void HardeningAssertGE(T val1, T val2) {
+inline void HardeningAssertGE(T val1, T val2) {
   ABSL_ASSERT(val1 >= val2);
 #if (ABSL_OPTION_HARDENED == 1 || ABSL_OPTION_HARDENED == 2) && defined(NDEBUG)
   if (!ABSL_PREDICT_TRUE(val1 >= val2)) {
@@ -96,7 +96,7 @@
 }
 
 template <typename T>
-constexpr void HardeningAssertLT(T val1, T val2) {
+inline void HardeningAssertLT(T val1, T val2) {
   ABSL_ASSERT(val1 < val2);
 #if (ABSL_OPTION_HARDENED == 1 || ABSL_OPTION_HARDENED == 2) && defined(NDEBUG)
   if (!ABSL_PREDICT_TRUE(val1 < val2)) {
@@ -106,7 +106,7 @@
 }
 
 template <typename T>
-constexpr void HardeningAssertLE(T val1, T val2) {
+inline void HardeningAssertLE(T val1, T val2) {
   ABSL_ASSERT(val1 <= val2);
 #if (ABSL_OPTION_HARDENED == 1 || ABSL_OPTION_HARDENED == 2) && defined(NDEBUG)
   if (!ABSL_PREDICT_TRUE(val1 <= val2)) {
@@ -115,12 +115,12 @@
 #endif
 }
 
-constexpr void HardeningAssertInBounds(size_t index, size_t size) {
+inline void HardeningAssertInBounds(size_t index, size_t size) {
   HardeningAssertLT(index, size);
 }
 
 template <typename T>
-constexpr void HardeningAssertNonEmpty(const T& container) {
+inline void HardeningAssertNonEmpty(const T& container) {
   ABSL_ASSERT(!container.empty());
 #if (ABSL_OPTION_HARDENED == 1 || ABSL_OPTION_HARDENED == 2) && defined(NDEBUG)
   if (ABSL_PREDICT_FALSE(container.empty())) {
@@ -130,7 +130,7 @@
 }
 
 template <typename T>
-constexpr void HardeningAssertNonNull(T ptr) {
+inline void HardeningAssertNonNull(T ptr) {
   ABSL_ASSERT(ptr != nullptr);
 #if (ABSL_OPTION_HARDENED == 1 || ABSL_OPTION_HARDENED == 2) && defined(NDEBUG)
   if (ABSL_PREDICT_FALSE(ptr == nullptr)) {
diff --git a/absl/types/BUILD.bazel b/absl/types/BUILD.bazel
index a3c038a..769f830 100644
--- a/absl/types/BUILD.bazel
+++ b/absl/types/BUILD.bazel
@@ -93,7 +93,6 @@
         "//absl/algorithm",
         "//absl/base:config",
         "//absl/base:core_headers",
-        "//absl/base:hardening",
         "//absl/base:nullability",
         "//absl/base:throw_delegate",
         "//absl/hash:weakly_mixed_integer",
@@ -134,7 +133,6 @@
     deps = [
         "//absl/base:config",
         "//absl/base:core_headers",
-        "//absl/base:hardening",
         "//absl/base:nullability",
         "//absl/base:raw_logging_internal",
         "//absl/base:throw_delegate",
@@ -260,7 +258,6 @@
     deps = [
         "//absl/base:config",
         "//absl/base:core_headers",
-        "//absl/base:hardening",
     ],
 )
 
diff --git a/absl/types/CMakeLists.txt b/absl/types/CMakeLists.txt
index f00b574..fd2f92f 100644
--- a/absl/types/CMakeLists.txt
+++ b/absl/types/CMakeLists.txt
@@ -39,7 +39,6 @@
   DEPS
     absl::config
     absl::core_headers
-    absl::hardening
     absl::nullability
     absl::raw_logging_internal
     absl::throw_delegate
@@ -79,7 +78,6 @@
     absl::algorithm
     absl::config
     absl::core_headers
-    absl::hardening
     absl::nullability
     absl::throw_delegate
     absl::type_traits
@@ -233,7 +231,6 @@
   DEPS
     absl::config
     absl::core_headers
-    absl::hardening
   PUBLIC
 )
 
diff --git a/absl/types/any_span.h b/absl/types/any_span.h
index d20f7bf..98ad4f9 100644
--- a/absl/types/any_span.h
+++ b/absl/types/any_span.h
@@ -213,7 +213,6 @@
 
 #include "absl/base/attributes.h"
 #include "absl/base/config.h"
-#include "absl/base/internal/hardening.h"
 #include "absl/base/internal/raw_logging.h"
 #include "absl/base/macros.h"
 #include "absl/base/nullability.h"
@@ -293,7 +292,7 @@
       "Iter must be a random access iterator.");
 
   Range(Iter begin, Iter end) {
-    absl::base_internal::HardeningAssertLE(begin, end);
+    ABSL_HARDENING_ASSERT(begin <= end);
     begin_ = begin;
     end_ = end;
   }
@@ -301,7 +300,7 @@
   std::size_t size() const { return end_ - begin_; }
 
   decltype(std::declval<Iter>()[0]) operator[](std::size_t i) const {
-    absl::base_internal::HardeningAssertLT(i, size());
+    ABSL_HARDENING_ASSERT(i < (end_ - begin_));
     return begin_[i];
   }
 
@@ -709,22 +708,19 @@
     if (len == AnySpan<T>::npos) {
       len = this_size - pos;
     }
-    absl::base_internal::HardeningAssertLE(pos, this_size);
-    absl::base_internal::HardeningAssertLE(len,
-                                           static_cast<size_type>(this_size
-                                                                  - pos));
+    ABSL_HARDENING_ASSERT(pos <= this_size && len <= this_size - pos);
     return AnySpan<T>(getter_.Offset(pos), len);
   }
 
   constexpr AnySpan subspan(size_type pos) const {
-    absl::base_internal::HardeningAssertLE(pos, size());
+    ABSL_HARDENING_ASSERT(pos <= size());
     return AnySpan(getter_.Offset(pos), size() - pos);
   }
 
   // Returns a `AnySpan` containing first `len` elements. Parameter `len`
   // must be non-negative and <= size().
   constexpr AnySpan first(size_type len) const {
-    absl::base_internal::HardeningAssert(len != AnySpan<T>::npos);
+    ABSL_HARDENING_ASSERT(len != AnySpan<T>::npos);
     return subspan(0, len);
   }
 
@@ -738,7 +734,7 @@
 
   // Element access.
   constexpr reference operator[](size_type index) const {
-    absl::base_internal::HardeningAssertLT(index, size());
+    ABSL_HARDENING_ASSERT(index < size());
     return getter_.Get(index);
   }
   constexpr reference at(size_type index) const {
@@ -748,11 +744,11 @@
     return getter_.Get(index);
   }
   constexpr reference front() const {
-    absl::base_internal::HardeningAssertGT(size(), size_type{0});
+    ABSL_HARDENING_ASSERT(size() > 0);
     return (*this)[0];
   }
   constexpr reference back() const {
-    absl::base_internal::HardeningAssertGT(size(), size_type{0});
+    ABSL_HARDENING_ASSERT(size() > 0);
     return (*this)[size() - 1];
   }
 
diff --git a/absl/types/optional_ref.h b/absl/types/optional_ref.h
index 920fe56..fb21333 100644
--- a/absl/types/optional_ref.h
+++ b/absl/types/optional_ref.h
@@ -67,7 +67,6 @@
 
 #include "absl/base/attributes.h"
 #include "absl/base/config.h"
-#include "absl/base/internal/hardening.h"
 #include "absl/base/macros.h"
 #include "absl/base/optimization.h"
 
@@ -163,11 +162,11 @@
   // Accesses the underlying `T` value of an `optional_ref`. If the
   // `optional_ref` is empty, behavior is undefined.
   constexpr T& operator*() const {
-    absl::base_internal::HardeningAssertNonNull(ptr_);
+    ABSL_HARDENING_ASSERT(ptr_ != nullptr);
     return *ptr_;
   }
   constexpr T* operator->() const {
-    absl::base_internal::HardeningAssertNonNull(ptr_);
+    ABSL_HARDENING_ASSERT(ptr_ != nullptr);
     return ptr_;
   }
 
diff --git a/absl/types/span.h b/absl/types/span.h
index 2327962..8c5736c 100644
--- a/absl/types/span.h
+++ b/absl/types/span.h
@@ -64,7 +64,6 @@
 
 #include "absl/base/attributes.h"
 #include "absl/base/config.h"
-#include "absl/base/internal/hardening.h"
 #include "absl/base/macros.h"
 #include "absl/base/nullability.h"
 #include "absl/base/optimization.h"
@@ -336,7 +335,7 @@
   //
   // Returns a reference to the i'th element of this span.
   constexpr reference operator[](size_type i) const noexcept {
-    absl::base_internal::HardeningAssertLT(i, size());
+    ABSL_HARDENING_ASSERT(i < size());
     return ptr_[i];
   }
 
@@ -355,7 +354,7 @@
   // Returns a reference to the first element of this span. The span must not
   // be empty.
   constexpr reference front() const noexcept {
-    absl::base_internal::HardeningAssertGT(size(), static_cast<size_t>(0));
+    ABSL_HARDENING_ASSERT(size() > 0);
     return *data();
   }
 
@@ -364,7 +363,7 @@
   // Returns a reference to the last element of this span. The span must not
   // be empty.
   constexpr reference back() const noexcept {
-    absl::base_internal::HardeningAssertGT(size(), static_cast<size_t>(0));
+    ABSL_HARDENING_ASSERT(size() > 0);
     return *(data() + size() - 1);
   }
 
@@ -430,7 +429,7 @@
   //
   // Removes the first `n` elements from the span.
   void remove_prefix(size_type n) noexcept {
-    absl::base_internal::HardeningAssertGE(size(), n);
+    ABSL_HARDENING_ASSERT(size() >= n);
     ptr_ += n;
     len_ -= n;
   }
@@ -439,7 +438,7 @@
   //
   // Removes the last `n` elements from the span.
   void remove_suffix(size_type n) noexcept {
-    absl::base_internal::HardeningAssertGE(size(), n);
+    ABSL_HARDENING_ASSERT(size() >= n);
     len_ -= n;
   }
 
@@ -738,7 +737,7 @@
 template <int&... ExplicitArgumentBarrier, typename T>
 Span<T> MakeSpan(T* absl_nullable begin ABSL_ATTRIBUTE_LIFETIME_BOUND,
                  T* absl_nullable end) noexcept {
-  absl::base_internal::HardeningAssertLE(begin, end);
+  ABSL_HARDENING_ASSERT(begin <= end);
   return Span<T>(begin, static_cast<size_t>(end - begin));
 }
 
@@ -799,7 +798,7 @@
 Span<const T> MakeConstSpan(T* absl_nullable begin
                                 ABSL_ATTRIBUTE_LIFETIME_BOUND,
                             T* absl_nullable end) noexcept {
-  absl::base_internal::HardeningAssertLE(begin, end);
+  ABSL_HARDENING_ASSERT(begin <= end);
   return Span<const T>(begin, end - begin);
 }