bssl::Span::subspan: split into two overloads.

This removes the runtime checking of whether the length is the sentinel
value `dynamic_extent`.

Update-Note: `bssl::Span::subspan` no longer allows an explicit second
argument of `dynamic_extent`. Previous `sp.subspan(pos, len)` can be
expressed as `len == bssl::dynamic_extent ? sp.subspan(pos) :
sp.subspan(pos, len)` if necessary.

Change-Id: I3a344a19d01da31ef91471bfbe4977ab75495680
Bug: 453872746
Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/84027
Auto-Submit: Rudolf Polzer <rpolzer@google.com>
Reviewed-by: David Benjamin <davidben@google.com>
Commit-Queue: Rudolf Polzer <rpolzer@google.com>
diff --git a/include/openssl/span.h b/include/openssl/span.h
index 85d84e4..428a9f3 100644
--- a/include/openssl/span.h
+++ b/include/openssl/span.h
@@ -254,14 +254,23 @@
 
  public:
   // NOTE: This method may abort() at runtime if pos or len are out of range.
-  constexpr Span<T> subspan(size_t pos = 0, size_t len = dynamic_extent) const {
+  // NOTE: As opposed to std::span, the |dynamic_extent| value of |len| is not
+  // magical here. This gets rid of a lot of runtime checks.
+  constexpr Span<T> subspan(size_t pos, size_t len) const {
     // absl::Span throws an exception here. Note std::span and Chromium
     // base::span forbid pos + len being out of range, with a special case at
     // npos/dynamic_extent, whereas absl::Span::subspan clips the span. This
     // implements the std::span behavior which is more strict.
     BSSL_CHECK(pos <= size());
-    BSSL_CHECK(len == dynamic_extent || len <= size() - pos);
-    return Span<T>(data() + pos, SubspanOutLen(size(), pos, len));
+    BSSL_CHECK(len <= size() - pos);
+    return Span<T>(data() + pos, len);
+  }
+
+  // NOTE: This method may abort() at runtime if pos is out of range.
+  constexpr Span<T> subspan(size_t pos) const {
+    // absl::Span throws an exception here.
+    BSSL_CHECK(pos <= size());
+    return Span<T>(data() + pos, size() - pos);
   }
 
   // NOTE: This method may abort() at runtime if len is out of range.
diff --git a/pki/input.h b/pki/input.h
index 7629055..250a6d4 100644
--- a/pki/input.h
+++ b/pki/input.h
@@ -95,9 +95,12 @@
   constexpr uint8_t operator[](size_t idx) const { return data_[idx]; }
   constexpr uint8_t front() const { return data_.front(); }
   constexpr uint8_t back() const { return data_.back(); }
-  constexpr Input subspan(size_t pos = 0, size_t len = dynamic_extent) const {
+  constexpr Input subspan(size_t pos, size_t len) const {
     return Input(data_.subspan(pos, len));
   }
+  constexpr Input subspan(size_t pos) const {
+    return Input(data_.subspan(pos));
+  }
   constexpr Input first(size_t len) const { return Input(data_.first(len)); }
   constexpr Input last(size_t len) const { return Input(data_.last(len)); }