[PR #6908] Move to GSL 3.1.0 #26812

Open
opened 2026-01-31 09:18:17 +00:00 by claunia · 0 comments
Owner

Original Pull Request: https://github.com/microsoft/terminal/pull/6908

State: closed
Merged: Yes


GSL 3, the next major version of GSL after the one we're using, replaced
their local implementation of span with one that more closely mimics
C++20's span. Unfortunately, that is a breaking change for all of GSL's
consumers.

This commit updates our use of span to comply with the new changes in
GSL 3.

Chief among those breaking changes is:

  • span::at no longer exists; I replaced many instances of span::at
    with gsl::at(x)
  • span::size_type has finally given up on ptrdiff_t and become
    size_t like all other containers

While I was here, I also made the following mechanical replacements:

  • In some of our "early standardized" code, we used std::optional's
    has_value and value back-to-back. Each value incurs an
    additional presence test.
    • Change: x.value().member -> x->member (optional::operator->
      skips the presence test)
    • Change: x.value() -> *x (as above)
  • GSL 3 uses size_t for size_type.
    • Change: gsl::narrow<size_t>(x.size()) -> x.size()
    • Change: gsl::narrow<ptrdiff_t>(nonSpan.size()) -> nonSpan.size()
      during span construction

I also replaced two instances of x[x.size() - 1] with x.back() and
one instance of a manual array walk (for comparison) with a direct
comparison.

NOTE: Span comparison and make_span are not part of the C++20 span
library.

Fixes #6251

**Original Pull Request:** https://github.com/microsoft/terminal/pull/6908 **State:** closed **Merged:** Yes --- GSL 3, the next major version of GSL after the one we're using, replaced their local implementation of `span` with one that more closely mimics C++20's span. Unfortunately, that is a breaking change for all of GSL's consumers. This commit updates our use of span to comply with the new changes in GSL 3. Chief among those breaking changes is: * `span::at` no longer exists; I replaced many instances of `span::at` with `gsl::at(x)` * `span::size_type` has finally given up on `ptrdiff_t` and become `size_t` like all other containers While I was here, I also made the following mechanical replacements: * In some of our "early standardized" code, we used std::optional's `has_value` and `value` back-to-back. Each `value` incurs an additional presence test. * Change: `x.value().member` -> `x->member` (`optional::operator->` skips the presence test) * Change: `x.value()` -> `*x` (as above) * GSL 3 uses `size_t` for `size_type`. * Change: `gsl::narrow<size_t>(x.size())` -> `x.size()` * Change: `gsl::narrow<ptrdiff_t>(nonSpan.size())` -> `nonSpan.size()` during span construction I also replaced two instances of `x[x.size() - 1]` with `x.back()` and one instance of a manual array walk (for comparison) with a direct comparison. NOTE: Span comparison and `make_span` are not part of the C++20 span library. Fixes #6251
claunia added the pull-request label 2026-01-31 09:18:17 +00:00
Sign in to join this conversation.
No Label pull-request
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: starred/terminal#26812