Skip to content

Changelog

Stephan T. Lavavej edited this page Apr 19, 2024 · 1920 revisions

Table of Contents

C++20 and C++23 features generally require the /std:c++20 and /std:c++latest compiler options, respectively.

VC Redist Lockdown

To reduce the frequency of required reboots when updating VS (and VS Previews), we "lock down" the Visual C++ Redistributable containing the STL's msvcp140.dll. (Most of the STL is header-only, so most changes are unaffected.) Approximately twice a year, specific VS Previews will be "unlocked", so the VC Redist will contain updated DLLs. VS 2022 17.11 will be locked.

VS 2022 17.11

Expected in VS 2022 17.11 Preview 2

  • Merged LWG issue resolutions:
    • LWG-3767 #4542 codecvt<charN_t, char8_t, mbstate_t> incorrectly added to locale
    • LWG-3984 #4543 ranges::to's recursion branch may be ill-formed
    • LWG-4016 #4539 container-insertable checks do not match what container-inserter does
    • LWG-4054 #4540 Repeating a repeat_view should repeat the view
  • Fixed bugs:
    • Added integral overloads for <cmath>'s classification functions fpclassify(), isfinite(), isinf(), isnan(), isnormal(), and signbit(). #4537
    • Fixed incorrect results from the vectorized implementation of ranges::find_last for certain combinations of value and element types. #4561
      • This fixed a regression that was introduced by #3925 in VS 2022 17.9.
    • Fixed is_trivial to correctly handle unusual types. #4576
    • Avoided mentioning __vectorcall for ARM64EC, where it is not yet supported. #4600
  • Improved performance:
    • Added vectorized implementations of:
      • replace() and ranges::replace for 32-bit and 64-bit elements. #4554 #4584
      • lexicographical_compare(), ranges::lexicographical_compare, and lexicographical_compare_three_way(). #4552
    • Further improved the vectorized implementations of:
      • find_first_of() and ranges::find_first_of. #4557 #4563 #4587
      • mismatch() and ranges::mismatch. #4584
      • count(), find(), ranges::count, ranges::find, and ranges::find_last. #4570
  • Improved throughput:
    • Slightly improved <mdspan> throughput by using short-circuiting conjunction_v instead of fold expressions. #4559
  • Enhanced behavior:
    • To reduce risk, the STL no longer attempts to activate vectorized implementations of algorithms for ancient processors that support SSE2 but not SSE4.2. #4550
      • This consolidated the STL's levels of vectorization to none, SSE4.2, and AVX2.
      • This also slightly improved performance (for non-ancient processors) by taking advantage of newer instructions in codepaths that previously restricted themselves to SSE2.
    • Added precondition checking in debug mode to views::take. #4551
    • Improved the wording of [[nodiscard("reason")]] messages for empty(). #4572
    • Massively improved the compiler error messages for get<T>(tuple<Types...>) when T doesn't occur exactly once in Types. #4578
    • Extended C++20's static_assert(is_clock_v<Clock>) enforcement for various codepaths to C++14/17 (with internal machinery; is_clock_v itself remains guarded by C++20 mode). #4585
  • Improved test coverage:
    • Added benchmarks for vectorized swap_ranges(). #4589
  • Code cleanups:
    • Consistently centralized how algorithms invoke their vectorized implementations. #4544
    • Simplified how condition_variable is implemented as a wrapper around the Windows API CONDITION_VARIABLE. #4545
    • Removed inline from constexpr variable templates. #4546
      • This became possible after all of our supported compilers implemented CWG-2387. Note that for constexpr variables, only primary templates and partial specializations no longer need to be marked as inline; explicit specializations and ordinary non-templates still need to be marked as inline.
    • Removed compiler bug workarounds. #4576
    • Changed machinery for updating chrono::tzdb::version to activate the Named Return Value Optimization. #4577
    • Updated tests to use C++17 terse static_assert. #4588
    • Simplified function templates to use static_assert(false) as permitted by CWG-2518. #4591
  • Infrastructure improvements:
    • Overhauled our Azure Pipelines machinery, introducing "Early Build" stages to quickly find compiler errors when building the STL. #4594
    • Updated dependencies. #4576 #4568 #4594
      • Updated build compiler to VS 2022 17.10 Preview 4.
      • Updated Python to 3.12.3.
      • Updated Boost.Math to 1.85.0. #4599
  • Updated _MSVC_STL_UPDATE. #4556

Expected in VS 2022 17.11 Preview 1

  • Merged C++26 features:
  • Merged partial C++23 features:
    • P2286R8 Formatting Ranges:
      • Implemented formatter for pair and tuple. #4438
  • Merged LWG issue resolutions:
    • LWG-3919 #4526 enumerate_view may invoke UB for sized common non-forward underlying ranges
    • LWG-3950 #4510 std::basic_string_view comparison operators are overspecified
    • LWG-4012 #4529 common_view::begin/end are missing the simple-view check
    • LWG-4013 #4530 lazy_split_view::outer-iterator::value_type should not provide default constructor
    • LWG-4035 #4525 single_view should provide empty
  • Fixed bugs:
    • Fixed condition_variable::wait_until() and condition_variable_any::wait_until() to consistently use the given time_point's clock type, instead of also depending on the system clock. This also fixed condition_variable::wait_for() and condition_variable_any::wait_for() to consistently use steady_clock. #4457
    • Fixed <format> to always perform compile-time format string checking for wchar_t, even when the narrow execution character set doesn't support it. #4459
    • Fixed compiler errors when constexpr basic_string interacted with the undocumented compiler option /d1initall. #4474
    • Fixed atomic_ref for 16-byte objects to correctly report is_lock_free() and is_always_lock_free on x64 (when the optional mode _STD_ATOMIC_ALWAYS_USE_CMPXCHG16B is defined to be 1) and ARM64 (always). #4478
    • Removed the vectorized implementation of ranges::find with unreachable_sentinel as it was fundamentally incompatible with ASan (Address Sanitizer). #4486
      • This was introduced by #2434 in VS 2022 17.3.
    • Fixed the STL to avoid emitting the off-by-default warning C4365 (signed/unsigned mismatch) when the /ZI compiler option (debug info for Edit and Continue) is used. #4487
      • These warnings were most noticeable when building the Standard Library Modules, but they were also emitted by classic includes.
    • Fixed the STL to avoid emitting the off-by-default warning C5246 (brace elision). #4527
    • Fixed compiler errors involving incomplete types in:
      • pair and tuple machinery. #4488
    • Fixed make_from_tuple() to properly implement LWG-3528 with a constraint instead of a static_assert. #4528
  • Improved performance:
    • Helped the compiler auto-vectorize replace_copy(), replace_copy_if(), ranges::replace_copy, and ranges::replace_copy_if. #4431
    • Added vectorized implementations of:
      • find_first_of() and ranges::find_first_of for 8-bit and 16-bit elements. #4466
      • mismatch() and ranges::mismatch. #4495 #4538
  • Enhanced behavior:
    • Improved compiler error messages when formatter<UDT>::format() isn't const. #4461
    • Changed the internal constructors of basic_format_arg::handle and basic_format_context to be private. #4489
    • Deleted the <cvt/meow> subdirectory of headers, shrinking VS installations by 4.8 MB across 78 files. #4458
    • Deleted the <experimental/meow> headers that provided std::experimental::erase()/erase_if(). #4470
  • Code cleanups:
    • Removed compiler bug workarounds. #4475
    • Various cleanups (described in detail in the PRs, not repeated here). #4465 #4490 #4493
    • Improved the script for downloading Unicode data files when updating <format>. #4469
  • Infrastructure improvements:
    • Updated dependencies. #4475 #4492
      • Updated build compiler to VS 2022 17.10 Preview 2.
      • Updated to Windows 11 SDK 22621. This is now required for building and testing the STL, but not for using it.
      • Updated CUDA to 12.4.0 (now required).
  • Updated _MSVC_STL_UPDATE. #4467

VS 2022 17.10

VS 2022 17.10 Preview 3

  • Fixed bugs:
    • Fixed compiler errors involving incomplete types in:
      • Sorting and related algorithms. #4367
      • vector's destructor and other member functions. #4373
      • Uninitialized memory algorithms. #4374
      • default_searcher. #4379
      • <ranges> views. #4389
      • Numeric algorithms. #4391
      • ranges::advance, ranges::distance, span constructors, and condition_variable::wait_for. #4402
      • shared_ptr creation functions and atomic smart pointers. #4403
      • function, move_only_function, packaged_task, promise, and optional. #4430
    • Fixed std.ixx to export VCRuntime machinery with Standard-conforming techniques. #4375
      • This affects things like std::exception, std::type_info, and ::operator new. The MSVC compiler currently doesn't enforce the rule in question here, but stricter tools might notice this.
    • Fixed basic_ostream::operator<<(basic_streambuf*) to rethrow caught exceptions only when failbit is set in exceptions(). #4372
    • Fixed atomic<shared_ptr>::wait() and atomic<weak_ptr>::wait() to properly detect equivalent smart pointers. #3655
    • Fixed unordered_map and unordered_set's equality operators to test elements for equality (via their operator==), not just equivalence (via the container's predicate for keys). #4406
      • unordered_multimap and unordered_multiset already behaved correctly.
    • Fixed compiler errors when using views::zip_transform with ranges that must be non-const to be iterated through, such as views::filter. #4416
    • Fixed compiler errors when using views::pairwise_transform and views::adjacent_transform via Standard Library Modules. #4420
    • Fixed compiler errors in C++17 numeric algorithms for highly unusual types. #4419
    • Fixed <format> to properly handle locale-specific floating-point formatting with a minimum field width, taking digit separators into account. #4421
    • Silenced "warning C4324: structure was padded due to alignment specifier" in all STL headers. #4426
      • This was spuriously emitted by certain combinations of code, e.g. views::cartesian_product with views::filter.
    • Fixed time_get::date_order() to correctly return time_base::mdy for the "C" locale, instead of picking up the date order for the current user locale. #4437
    • Fixed seed_seq::generate(RanIt, RanIt) to static_assert that the iterator's value type is at least a 32-bit unsigned integer type. #4447
    • Fixed crashes and incorrect results in the vectorized implementation of ranges::find with unreachable_sentinel. #4450
      • This fixed regressions that were introduced by #2434 in VS 2022 17.3.
  • Improved performance:
    • Slightly improved performance by taking advantage of P1169R4 static operator() in the STL's stateless function objects and lambdas. #4358
      • This is conditional on compiler feature availability (currently implemented by Clang), but not on Standard mode. Like C++17 if constexpr and C++20 explicit(bool), compilers will support C++23 static operator() in earlier Standard modes (emitting warnings that Future Technology is being used, which the STL internally suppresses).
    • Improved the vectorized implementations of min_element(), max_element(), minmax_element(), and related algorithms:
      • Extended them to handle floating-point types. #3928
      • Further improved performance by restructuring control flow. #4401
    • Improved the vectorized implementations of ranges::min, ranges::max, ranges::minmax, and the min(), max(), and minmax() overloads for initializer_list. #4384
      • These algorithms only need to track values, not locations.
    • Improved the vectorized implementation of bitset::to_string(). #4382 #4422
    • Changed the destructors of mutex and recursive_mutex to be trivial. #4390
      • This especially benefits variables with static storage duration, as they no longer need "dynamic atexit destructors".
    • Slightly improved performance by replacing CRITICAL_SECTION with SRWLOCK in:
      • get_new_handler() and set_new_handler(). #4407
      • At-thread-exit machinery. #4408
  • Enhanced behavior:
    • Changed basic_regex's constructor to throw an exception instead of stack overflowing when the pattern contains an excessive number of capture groups. #4451
      • Currently, this arbitrarily limits the number of capture groups to 1000.
  • Improved test coverage:
    • Fixed sporadic "unresolved" test failures. #4366
    • Simplified our command-line test coverage of the EDG compiler front-end. #4297 #4440
    • Added benchmarks for vectorized ranges::find and ranges::count. #4387
      • This also covers classic find() and count(), which share the same vectorized implementation.
    • Fixed the test harness to handle paths case-insensitively. #4395
    • Updated tests to work with Clang 18. #4452
    • Enabled more test coverage for the off-by-default warning C4668 "'MEOW' is not defined as a preprocessor macro, replacing with '0' for '#if/#elif'". #4441
  • Code cleanups:
    • Removed an enormous amount of code that was dealing with __cpp_lib_concepts missing in C++20 mode. #4298 #4364
      • Now, the STL's product and test code assumes that concepts are always available in C++20 mode, with targeted workarounds for reported compiler bugs.
    • Various cleanups (described in detail in the PRs, not repeated here). #4362 #4439 #4442 #4443 #4444 #4445
    • Removed compiler bug workarounds. #4392
    • Unified our internal stringizing macros. #4405
    • Added top-level const to function parameters in the vectorized implementations of algorithms. #4410
    • Added a script to download Unicode data files when updating <format>. #4435
    • Simplified how we handle Unicode field widths when updating <format>. Now we use a single script to process all Unicode data files, emitting tables into a single generated header. #4446
    • Used if constexpr to simplify helper functions for allocating and deallocating memory. #4432
  • Infrastructure improvements:
    • Updated dependencies. #4392
      • Updated build compiler to VS 2022 17.10 Preview 1 (now required).
      • Updated CMake to 3.28 (now required).
      • Updated Python to 3.12.2.

VS 2022 17.10 Preview 2

  • Fixed bugs:
    • Fixed mutex's constructor to be constexpr. #3824 #4000 #4339
      • Note: Programs that aren't following the documented restrictions on binary compatibility may encounter null dereferences in mutex machinery. You must follow this rule:

        When you mix binaries built by different supported versions of the toolset, the Redistributable version must be at least as new as the latest toolset used by any app component.

      • You can define _DISABLE_CONSTEXPR_MUTEX_CONSTRUCTOR as an escape hatch.
    • Fixed truncation warnings when using views::repeat. #4255
    • Fixed compiler errors involving incomplete types in:
      • atomic and atomic_ref. #4221
      • Modifying algorithms. #4256
      • Container operations taking iterator pairs. #4258
      • is_nothrow_convertible. #4318
      • Comparison operators. #4334
      • Merge algorithms, set operations, heap operations, and permutation generators. #4347
    • Fixed compiler errors when defining variadic alias templates for is_nothrow_convertible. #4318
    • Fixed filesystem::is_empty() and filesystem::directory_iterator to handle empty volumes (before they've been assigned a drive letter). #4311
    • Fixed compiler errors in algorithms involving highly unusual types. #4233
    • Fixed basic_stringbuf to avoid implementing moving with swapping, which is a correctness issue for unusual custom allocators. #4239
    • Fixed <format> to properly handle floating-point values in a specific situation. When a format-specifier appears without any precision or type, shortest round-trip formatting should be used instead of chars_format::general. #4327
      • Example format strings: "{:}" and "{0:}" were affected, as they have an optional arg-id (0) followed by a format-specifier (:) with an empty format-spec (nothing after the :).
      • More common format strings like "{}" and "{0}" were unaffected, as they entirely lack a format-specifier.
      • Example value: For 12345678.0, the shortest round-trip rules produce "12345678", while the chars_format::general rules produce "1.2345678e+07".
    • Fixed deque::shrink_to_fit() to follow the Standard instead of unconditionally moving elements. #4091
    • Fixed allocate_shared_for_overwrite() to directly destroy objects, instead of using Alloc::destroy(). #4274
    • Removed ios_base::hexfloat, a non-Standard bitmask element. #4345
      • The Standard ways to request hexadecimal floating-point output are to use the ios_base::fixed | ios_base::scientific bitmask elements together or to use the std::hexfloat manipulator.
  • Improved performance:
    • Added a vectorized implementation of bitset::to_string(). #3960
    • Optimized filesystem::path's operator/ to perform a single memory allocation for common cases. #4136
  • Enhanced behavior:
    • Updated <charconv> to use the __umulh intrinsic for ARM64 CHPE (_M_HYBRID_X86_ARM64). #4330
    • Improved expected's copy/move assignment operators to be trivial when possible, like how optional and variant already behave. #4271
    • Improved <random>'s TR1 legacy code: #4284
      • Deprecated the non-Standard engines (discard_block, linear_congruential, mersenne_twister, subtract_with_carry) and distributions (uniform_int, uniform_real) that are still provided in the std namespace.
      • Removed non-Standard machinery from Standard engines and distributions. (For example, certain static constexpr data members in mersenne_twister_engine and an extra function call operator overload in uniform_int_distribution.)
  • Improved test coverage:
    • Minor test improvements, including printing exit codes in both decimal and hex. #4309
    • Improved output for "unresolved" test failures. #4323
    • Added support for building the STL's separately compiled code with ASan instrumentation and enabled this in the STL-ASan-CI pipeline. #4313
    • Updated our LLVM submodule, including new tests. #4328 #4336 #4348 #4355
    • Updated CTest to avoid running 2N tests in parallel, where N is the number of cores available. #4335
    • Enabled __cpp_lib_concepts for our command-line test coverage of the EDG compiler front-end. #4296
      • __cpp_lib_concepts was already enabled for EDG-powered IntelliSense in the VS IDE, so this change isn't directly observable by users, it'll just help the STL work better with IntelliSense in the future.
    • Enabled compiler warnings when building the STL's benchmarks. #4356
  • Code cleanups:
    • Removed compiler bug workarounds. #4340
  • Updated _MSVC_STL_UPDATE. #4361

VS 2022 17.10 Preview 1

  • Merged C++26 features:
  • Merged C++23 features:
    • P2836R1 #4188 basic_const_iterator Should Follow Its Underlying Type's Convertibility
  • Merged partial C++23 features:
    • P2286R8 Formatting Ranges:
      • Implemented formatter<vector<bool>::reference>. #4133
  • Merged C++20 Defect Reports:
  • Merged LWG issue resolutions:
    • LWG-3749 #4190 common_iterator should handle integer-class difference types
    • LWG-3809 #4194 Is subtract_with_carry_engine<uint16_t> supposed to work?
    • LWG-3897 #4186 inout_ptr will not update raw pointer to null
    • LWG-3946 #4187 The definition of const_iterator_t should be reworked
    • LWG-3947 #4195 Unexpected constraints on adjacent_transform_view::base()
    • LWG-3949 #4204 atomic<bool>'s trivial destructor dropped in C++17 spec wording
    • LWG-3953 #4167 iter_move for common_iterator and counted_iterator should return decltype(auto)
    • LWG-3974 #4214 mdspan::operator[] should not copy OtherIndexTypes
    • LWG-4001 #4193 iota_view should provide empty
  • Fixed bugs:
    • Fixed <format>'s compile-time format string checking:
      • To detect when user-defined formatter specializations reject omitted format specifications like "{}". #4078
      • To require that dynamic width and precision arguments have integral types. #4155
    • Fixed how format() handles empty strings like format("{:a<10}", ""). #4243
    • Fixed format() to accept %X and %EX for chrono::duration and chrono::hh_mm_ss. #4250
    • Fixed compiler errors involving incomplete types in:
      • Non-modifying algorithms. #4138
      • erase(), erase_if(), remove(), remove_if(). #4217
      • [alg.min.max], [alg.clamp], [alg.lex.comparison], [alg.three.way] algorithms. #4216
    • Fixed ranges::to to properly reject certain invalid uses with compiler errors, instead of trapping compilers in infinite loops of doom. #4142
    • Fixed ranges::to to accept certain container constructors taking a range followed by more than one argument. #4218
    • Fixed compiler errors involving range adaptor closure objects in unusual scenarios. #4211
    • Fixed incorrect output from iostreams (like "i.nf") when printing infinity and NaN values with setprecision(0) << showpoint << fixed. #4212
    • Fixed problems involving unusual allocators with size types other than size_t:
      • Compiler errors in basic_stringbuf::overflow(). #4219
      • Truncation warnings in basic_stringbuf's constructor, string/vector iterator subtraction, ranges::is_permutation, and allocate_shared(). #4228 #4237 #4252
    • Fixed <atomic> correctness issues for ARM64 CHPE (_M_HYBRID_X86_ARM64). #4222
    • Fixed sign-compare warnings in <mdspan> when using extents with different index types. #4227
    • Fixed compiler errors in <mdspan> when constructing unusual mappings. #4236
    • Fixed ranges::ssize to be conditionally noexcept as required by the Standard. #4231
    • Fixed bugs specific to extremely unusual fancy pointers:
      • Fixed how such vectors interact with ranges algorithms. #4244
      • Fixed how such vectors and basic_strings interact with classic algorithms and iterator spaceship comparisons. #4275
    • Fixed compiler errors when constructing locale{nullptr}. #4245
      • Rejoice, for now you can get a guaranteed runtime_error!
    • Fixed compiler errors when overloading next(), prev(), shift_left(), and shift_right() with concept-constrained functions that should be preferred during overload resolution. #4249
    • Fixed compiler errors when comparing a sub_match with the spaceship operator <=> to a basic_string with a custom traits and/or allocator type. #4253
    • Fixed sequence container constructors to avoid interfering with CTAD (class template argument deduction) for (Iter, Iter, BadAlloc); now this will SFINAE away instead of emitting a hard compiler error. #4254
    • Fixed join_view and join_with_view's iterators to be default constructible. #4264
    • Fixed atomic by adding atomic& operator=(const atomic&) volatile = delete; as required by the Standard. #4287
    • Fixed compiler errors in parallel transform_reduce() when performing narrowing conversions. #4260
      • As usual, asking the STL to perform conversions on your behalf may emit sign/truncation compiler warnings; this is by design.
    • Fixed compiler errors during constexpr evaluation of vector<bool> caused by improper casting in iterator debugging machinery. #4276
    • Fixed compiler errors (by adding a compiler bug workaround) when using constexpr invoke() to call pointers to data members with reference_wrapper arguments. #4277
    • Fixed chrono::duration formatting to respect dynamically provided widths. #4283
    • Added macroization defenses for the STL's non-Standard extensions (e.g. type_info's raw_name member function). #4285
    • Fixed floating-point to_chars() on ARM64 to return correct results. #4304
  • Improved performance:
    • Improved <atomic> performance: #4222
      • For ARM64, significantly improved the performance of atomic<T>::load() (taking no arguments, requesting sequential consistency), matching how #3399 in VS 2022 17.6 improved atomic<T>::load(memory_order_seq_cst).
      • For ARM64 CHPE (_M_HYBRID_X86_ARM64), atomic<T>'s exchange/compare_exchange_MEOW/fetch_MEOW now respect memory_order arguments instead of always providing sequential consistency. Also, ARM64 CHPE now benefits from all of #3399's major improvements.
    • Slightly improved the codegen for uniform_int_distribution. #4234
    • Improved atomic::wait family performance by internally using memory_order_acq_rel instead of memory_order_seq_cst when initializing OS support functions. #4288
  • Enhanced behavior:
    • The C++17 Standard added invoke() and the C++20 Standard made it constexpr. Previously, MSVC made non-constexpr invoke() unconditionally available, and constexpr invoke() available in C++17 mode, as minor extensions. Now, constexpr invoke() is unconditionally available. #4080
    • Wrapped the STL in extern "C++" as a temporary workaround to allow #include <meow> to coexist with import std; in the same translation unit, in that order. #4154
      • The other order, import std; before #include <meow>, will still cause compiler errors. We're working on a long-term solution.
    • Improved shared_ptr constructor constraints to avoid forming invalid types. #4290
  • Improved test coverage:
  • Code cleanups:
  • Infrastructure improvements:
    • Updated dependencies. #4197 #4206 #4259 #4303
      • Updated build compiler to VS 2022 17.9 Preview 2 (now required).
      • Updated Clang to 17.0.3 (now required).
      • Updated Python to 3.12.1.
      • Updated Boost.Math to 1.84.0. #4280
  • Updated _MSVC_STL_UPDATE. #4213 #4226 #4293

VS 2022 17.9

  • Merged C++23 features:
    • P0009R18 #3972 #4037 <mdspan>
      • P2599R2 mdspan: index_type, size_type
      • P2604R0 mdspan: data_handle_type, data_handle(), exhaustive
      • P2613R1 mdspan: empty()
      • P2763R1 Fixing layout_stride's Default Constructor For Fully Static Extents
    • P1169R4 #4053 static operator()
      • This updates CTAD (class template argument deduction) for std::function and packaged_task to work with a C++23 Core Language feature, currently supported for Clang only. When MSVC and IntelliSense implement this Core feature, this will automatically "light up" the STL's CTAD for them too.
  • Merged partial C++23 features:
    • P2286R8 Formatting Ranges:
      • Implemented formatter::set_debug_format(). #3913
      • Implemented formattable, range_format, and format_kind. #4116
  • Merged LWG issue resolutions:
    • LWG-3561 #4066 Issue with internal counter in discard_block_engine
  • Fixed bugs:
    • Fixed incorrect results from iostreams floating-point parsing (e.g. "1e-07" was incorrectly parsed as 1e-06). #3982
      • This fixed a regression that was introduced by #3364 in VS 2022 17.7.
      • We backported this fix to VS 2022 17.8.
    • Fixed compiler errors when using expected together with any. #4013
    • Fixed incorrect behavior when self-move-assigning any, and fixed compiler errors in any involving incomplete types. #3965
    • Fixed bugs in basic_string's copy assignment operator, specific to non-equal propagate_on_container_copy_assignment allocators, involving ASan annotations or fancy pointers. #4031
    • Fixed get() and comparison operators to handle program-defined specializations of array. #4041
    • Fixed compiler errors in to_array() involving incomplete types. #4042
    • Fixed linker errors involving stl_asan.lib by disabling ASan annotations in the STL for unsupported platforms (e.g. ARM, ARM64, ARM64EC). #4058
    • Fixed not_fn() to return a perfect forwarding call wrapper in C++20 mode as required by P0356R5. #4057
    • Fixed deque to preserve its internal invariants when taking advantage of allocators that provide allocate_at_least(). #4017
    • Fixed deque emplace() and insert() to not require elements to be swappable; this change also improved performance. #4022
    • Fixed deque to handle highly unusual fancy pointers. #4049
    • Fixed deque::shrink_to_fit() to avoid requiring the allocator to be default constructible. #4071
    • Fixed allocate_shared() for unbounded arrays to handle fancy pointers. #4074
    • Fixed the implementation of P0408R7 Efficient Access To basic_stringbuf's Buffer to properly destroy fancy pointers. #4047
    • Fixed this_thread::sleep_until() to consistently use the given time_point's clock type, instead of also depending on the system clock. This also fixed this_thread::sleep_for() to consistently use steady_clock. #3914
    • Fixed minor conformance issues in <random>: #4120
      • Removed non-Standard base_type typedefs from discard_block_engine, independent_bits_engine, and shuffle_order_engine.
      • Fixed discard_block_engine(Engine&&) to move-construct the base engine instead of copying it.
  • Improved performance:
    • Optimized the copy(), copy_n(), and move() algorithms for vector<bool> iterators, with speedups varying from 1.8x (times, not percent) to an incredible 3200x, depending on the size and alignment of the bits being copied. #3353 #4045
    • Optimized priority_queue::push_range() for small ranges. #4025
    • Improved debug codegen for deque by using unchecked iterators internally. #4071
    • Optimized basic_string's range constructors to use memmove() for contiguous ranges when possible. #4073
    • Added a vectorized implementation of ranges::find_last. #3925
  • Enhanced behavior:
    • Added debug checks to <valarray> binary operations, verifying that the operands have the same size. #3911
    • Deprecated basic_istream's ipfx()/isfx() and basic_ostream's opfx()/osfx() member functions as they're non-Standard extensions. #4006
    • Added compiler bug workarounds for the upcoming Clang 17 release. #4014
    • Improved the STL's error messages so that error logs will record specific static_asserts like "error STL1000: Unexpected compiler version, expected Clang 16.0.0 or newer." instead of just "Error in C++ Standard Library usage." #4020
    • Silenced /Wall warnings:
      • When building the Standard Library Modules. #4026
      • Warning C4868 "compiler may not enforce left-to-right evaluation order in braced initializer list" throughout the STL. #4067
      • Note: /Wall is not intended for regular production use, as it contains a large number of extremely noisy and low-value warnings. In general, the STL does not attempt to be /Wall clean.
    • Changed num_get::do_get() to tolerate 80-bit long double by removing a static_assert that was added in 2018. #4032
      • Note: 80-bit long double remains unsupported by MSVC.
    • Improved source_location::function_name(): #4055
      • It will return detailed information for Clang 17.
      • Added an "escape hatch" for all compilers: define _USE_DETAILED_FUNCTION_NAME_IN_SOURCE_LOCATION to 0.
      • For example, given template <typename T> void cats() called with cats<vector<int>>(), MSVC's detailed info (implemented in VS 2022 17.6) is "void __cdecl cats<class std::vector<int,class std::allocator<int> >>(void)". Clang 17's detailed info is "void __cdecl cats(void) [T = std::vector<int>]". The escape hatch will return the basic info "cats".
    • Changed the ranges algorithms to be ordinary function objects. #4098
      • For example, this allows code like views::transform(ranges::distance) to compile.
    • Marked internal extern "C" functions as noexcept. #4106 #4150
      • This improves codegen for /EHs (versus /EHsc, where extern "C" already implies noexcept).
  • Improved test coverage:
    • Added an STL-ASan-CI pipeline. #3987 #3989 #4029 #4052 #4068 #4069 #4075
    • The test harness now cleans up emitted files as it runs. #4086
    • Simplified the feature-test macro test. #4103
    • Enabled test coverage for basic_string's ASan annotations when exception handling interacts with the Small String Optimization. #4118
  • Code cleanups:
  • Improved documentation:
    • Improved the consistency of preprocessor comments. #3950
  • Infrastructure improvements:
    • Updated dependencies. #4028 #4039 #4083
      • Updated build compiler to VS 2022 17.8 Preview 3 (now required).
      • Updated CMake to 3.27 (now required).
      • Updated Python to 3.12.0 (now required).
      • Updated Google Benchmark to 1.8.3. #4021
  • Updated _MSVC_STL_UPDATE. #4003 #4062

VS 2022 17.8

  • Merged C++26 features:
    • P2013R5 #3837 Freestanding Language: Optional ::operator new
    • P2198R7 #3837 Freestanding Feature-Test Macros And Implementation-Defined Extensions
    • P2338R4 #3837 Freestanding Library: Character Primitives And The C Library
    • P2538R1 #3822 ADL-Proof projected
  • Merged C++23 features:
  • Merged C++20 extension:
    • The C++23 named modules std and std.compat are now available when compiling in C++20 mode. #3977
      • This extension should eventually be portable to the major Standard Library implementations via an informal agreement between implementers.
      • Build systems - including the Visual Studio IDE - will need changes to support import std in C++20. This change makes it possible for them to do so.
  • Merged LWG issue resolutions:
    • LWG-3631 #3745 basic_format_arg(T&&) should use remove_cvref_t<T> throughout
    • LWG-3843 #3737 std::expected<T, E>::value() & assumes E is copy constructible
    • LWG-3893 #3782 LWG-3661 broke atomic<shared_ptr<T>> a; a = nullptr;
    • LWG-3904 #3781 lazy_split_view::outer-iterator's const-converting constructor isn't setting trailing_empty_
  • Fixed bugs:
    • Fixed the deque(size_type) constructor to properly destroy elements when constructing one of them throws an exception. #3720
    • Removed a non-Standard operator basic_istream >> setfill(c). #3725
    • Fixed linker errors when linking x64 object files into ARM64EC programs. #3732
      • We backported this fix to VS 2022 17.6.6 and VS 2022 17.7.
    • Fixed the debug mode check in cartesian_product_view::size() to always accept empty views. #3733
    • Fixed formatter<char, wchar_t> to format the char as a character instead of an integer. #3723
    • The STL now avoids dragging in the non-reserved name ISA_AVAILABILITY. #3721
    • Fixed chrono::hh_mm_ss formatting to accept values of 24 hours or more. #3727
    • Changed the STL's usage of compiler-specific custom attributes to further defend against macros. #3760
    • Fixed condition_variable_any::wait_until() to handle time_points with unsigned representations instead of waiting forever. #3761
    • Fixed counting_semaphore to add compile-time enforcement of the Standard's mandates. #3747
    • Fixed a bug, affecting UWP apps only, where locking a mutex could throw a bogus exception. #3763
    • Fixed the signatures of char_traits member functions to exactly match the Standard. #3739
      • This Standardese was updated by N2349 in C++11.
    • Fixed compiler errors when visit_format_arg() is called with highly unusual visitors. #3787
    • Fixed incorrect output when format() is asked to format a floating-point value in the alternate form without a type specifier. #3815
    • Added a compiler bug workaround for MSVC modules, allowing <format> machinery to work with /utf-8 via import std;. #3816
    • Fixed a subtle bug affecting constexpr basic_string's copy assignment operator, where it wasn't starting element lifetimes for the unused capacity. #3712 #3819
    • Fixed Clang compiler errors when calling function::target<FunctionType>() on const function objects. #3844
      • This is an obscure corner case, because such calls are guaranteed to return null.
    • Fixed compiler errors when using array<T, 0> in constexpr contexts. #3863
    • Improved function call operator overload resolution for the bind(), bind_front(), and bind_back() function objects. #3775
    • Fixed iostreams with imbued locales to print infinities and NaNs correctly. #3868 #3877
    • Fixed incorrect noexcepts within the implementations of filesystem::current_path(), filesystem::current_path(error_code&), read_symlink(const path&), and read_symlink(const path&, error_code&). #3869 #3881
    • Fixed shared_ptr<void> to not be constructible from void*. #3873
    • Fixed a complicated modules scenario by removing #pragma once from all STL headers. #3895
      • #pragma once is no longer needed to improve throughput because modern compilers automatically detect the idempotency guard idiom.
    • Fixed <stacktrace>'s internal use of snprintf() in extreme situations. #3916
    • Fixed an extremely obscure runtime correctness bug in basic_string's copy assignment operator, specific to non-equal propagate_on_container_copy_assignment allocators. #3862
    • Fixed ASan annotations in basic_string::replace(). #3884
    • Fixed ASan annotations in basic_string::assign() and basic_string::resize_and_overwrite(). #3956
  • Improved performance:
    • Changed some helper member functions to be static, slightly improving debug codegen. #3755
    • mutex and condition_variable now avoid virtual function calls within their implementations. #3770
    • Optimized steady_clock::now() when QueryPerformanceFrequency() is exactly 24 MHz, which is very common for ARM64. #3832
    • Optimized filesystem::path::lexically_normal(). #3850
    • basic_string, basic_stringbuf, basic_syncbuf, deque, and vector now take advantage of allocators that provide allocate_at_least(). #3864 #3891
    • Optimized <format> slightly. #3826
    • Optimized bitset::to_string(). #3838 #3904
    • Added an attribute to as_const(), to_integer(), and to_underlying() that allows the MSVC compiler to intrinsically implement them without emitting function calls. #3664
    • Made a tiny tweak to valarray (access the stored size directly instead of via calling size()) to improve debug codegen. #3968
  • Improved throughput:
    • Moved machinery: #3719
      • Moved integer_sequence, make_integer_sequence, index_sequence, make_index_sequence, and index_sequence_for from <type_traits> to <utility>, which is where the Standard provides them.
      • Moved allocator_arg, allocator_arg_t, uses_allocator, and uses_allocator_v so that they're dragged in by slightly fewer headers. (The Standard provides them in <memory>.)
    • Some headers now avoid including <limits>. #3777
    • In C++17 mode and later, improved Clang throughput for an internal helper wrapping is_same_v. #3933
  • Enhanced behavior:
    • Added precondition checking in debug mode to the iota_view(value) constructor. #3731
    • Improved precondition checking in debug mode for barrier. #3757
    • Fixed static analysis warnings. #3734 #3743
      • Note: The STL has always attempted to be /W4 /analyze clean, but does not yet attempt to be clean with respect to all additional static analysis rulesets.
    • Strengthened the exception specifications for:
      • Internal <ranges> machinery used in join_view iterators and lazy_split_view. #3762
      • basic_string_view::compare(const charT*). #3738
      • Constructors of locale::facet and related base classes. #3855
      • Many functions in <complex>. #3880
      • Many functions in <random>, some functions in <valarray>, and 3-arg hypot() in <cmath>. #3887
    • The STL now avoids conflicting with non-Standard macros of reserved names that were defined by old versions of the ICU library. #3776
    • Updated stdext::checked_array_iterator and stdext::unchecked_array_iterator: #3818
      • Added constness conversions.
      • Deprecated these iterators, which have been superseded by std::span and gsl::span.
    • Added "lifetimebound" attributes to minmax and ranges::minmax, allowing MSVC code analysis and Clang -Wdangling to detect dangling references in improper usage. #3831
    • Improved how views::cartesian_product detects ranges with maximum sizes that are known at compile time. #3839
    • Improved how parallel algorithms perform compile-time iterator type checking. #3899
    • The STL now calls abort() instead of terminate() for unrecoverable conditions, when the Standard doesn't require terminate() to be called. #3906 #3909
    • Improved the visualizer for vector<char> and the other character types. #3772
    • Improved the visualizer for mutex and recursive_mutex. #3848
    • Updated chrono::duration_cast() to use if constexpr, improving debug codegen. #3958
  • Improved test coverage:
    • Added properly functioning test coverage for ranges::owning_view. #3753
    • Added test coverage for calling tellg() while reading an LF file in text mode. #3773 #3841
    • Added test coverage for LWG-2295 Locale name when the provided Facet is a nullptr. #3823
    • Added test coverage for LWG-2682 filesystem::copy() won't create a symlink to a directory. #3827
    • Updated tests to use lvalue references for the LHS of is_assignable_v and is_nothrow_assignable_v. #3898
    • Added more tests for views::as_const, views::stride, and views::zip. #3920
    • Test code now consistently uses override to avoid mistakes, following the same convention as product code. #3934
    • Fixed precondition violations in is_permutation() tests. #3967
    • Fixed precondition violations in regex_iterator and regex_token_iterator tests. #3990
  • Code cleanups:
    • Removed compiler bug workarounds. #3722 #3769 #3866 #3939
    • Improved SFINAE to follow modern conventions. #3736
    • Various cleanups (described in detail in the PRs, not repeated here). #3758 #3759 #3765 #3768 #3912 #3927 #3935
    • Removed comments that were citing proposed resolutions for LWG issues, now that those issues have been officially resolved by the June 2023 meeting. #3784 #3785
    • Marked internal machinery as [[noreturn]]. #3865 #3882
    • Removed unnecessary typename keywords in C++20 mode and later. #3892 #3893 #3894
    • Improved type safety by using an enum class for internal machinery within <condition_variable>, <mutex>, and <thread>. #3897
    • Improved the consistency of code that should never be called. #3905
    • Removed unused code. #3936
    • Improved the clarity and maintainability of basic_string's implementation. #3862
    • Deprecated the non-standard <cvt/meow> headers and their provided character encoding conversion machinery. #3924
  • Improved documentation:
    • Added comments where the Standard requires terminate() to be called. #3907
    • Improved the consistency of preprocessor comments. #3900 #3951
  • Infrastructure improvements:
    • Modernized code format validation to use <print>. #3919
    • Updated dependencies. #3769 #3866 #3939
      • Updated build compiler to VS 2022 17.8 Preview 1.
      • Updated Boost.Math to 1.83.0. #3952
      • Updated Clang to 16.0.5.
      • Updated Python to 3.11.4.
  • Build system improvements:
    • Added CMakePresets.json to simplify the process of building the repo. #3730 #3930
  • Updated _MSVC_STL_UPDATE. #3742 #3851 #3918

VS 2022 17.7

  • Merged C++23 features:
    • P1467R9 #3583 Extended Floating-Point Types
      • Note: This means that we provide the <stdfloat> header containing an empty namespace std {}, as we don't support any optional extended floating-point types.
    • P2093R14 #3337 <print>: Formatted Output
      • P2539R4 Synchronizing print() With The Underlying Stream
    • P2164R9 #3472 views::enumerate
    • P2165R4 #3372 Compatibility Between tuple, pair, And tuple-like Objects
    • P2321R2 zip, completed by implementing:
      • views::adjacent and views::pairwise. #3508
      • views::adjacent_transform and views::pairwise_transform. #3546
    • P2374R4 #3561 views::cartesian_product
      • P2540R1 Empty Product For Certain Views
    • P2572R1 #3629 std::format Fill Character Allowances
    • P2609R3 #3486 Relaxing Ranges Just A Smidge
    • P2614R2 #3482 Deprecating float_denorm_style, numeric_limits::has_denorm, numeric_limits::has_denorm_loss
    • P2652R2 #3542 Disallowing User Specialization Of allocator_traits
    • P2655R3 #3513 common_reference_t Of reference_wrapper Should Be A Reference Type
    • P2736R2 #3556 Referencing The Unicode Standard
      • <format> now understands Unicode 15.
    • P2770R0 #3466 Stashing Stashing Iterators For Proper Flattening
  • Merged partial C++23 features:
    • P2286R8 Formatting Ranges:
      • Implemented the ? format specifier for strings and characters. #3656
  • Merged LWG issue resolutions:
    • LWG-2195 #3506 Missing constructors for match_results
    • LWG-2309 #3469 mutex::lock() should not throw device_or_resource_busy
    • LWG-2381 #3364 Inconsistency in parsing floating point numbers
    • LWG-3204 #3494 sub_match::swap only swaps the base class
    • LWG-3655 #3495 The INVOKE operation and union types
    • LWG-3677 #3396 Is a cv-qualified pair specially handled in uses-allocator construction?
    • LWG-3720 #3511 Restrict the valid types of arg-id for width and precision in std-format-spec
    • LWG-3733 #3496 ranges::to misuses cpp17-input-iterator
    • LWG-3734 #3503 Inconsistency in inout_ptr and out_ptr for empty case
    • LWG-3821 #3509 uses_allocator_construction_args should have overload for pair-like
    • LWG-3833 #3477 Remove specialization template<size_t N> struct formatter<const charT[N], charT>
    • LWG-3836 #3587 std::expected<bool, E1> conversion constructor expected(const expected<U, G>&) should take precedence over expected(U&&) with operator bool
    • LWG-3847 #3479 ranges::to can still return views
    • LWG-3851 #3517 chunk_view::inner-iterator missing custom iter_move and iter_swap
    • LWG-3860 #3480 range_common_reference_t is missing
    • LWG-3862 #3471 basic_const_iterator's common_type specialization is underconstrained
    • LWG-3865 #3476 Sorting a range of pairs
      • This can be a source-breaking change in unusual scenarios.
    • LWG-3869 #3487 Deprecate std::errc constants related to UNIX STREAMS
    • LWG-3870 #3475 Remove voidify
    • LWG-3872 #3470 basic_const_iterator should have custom iter_move
    • LWG-3875 #3485 std::ranges::repeat_view<T, IntegerClass>::iterator may be ill-formed
    • LWG-3877 #3504 Incorrect constraints on const-qualified monadic overloads for std::expected
    • LWG-3887 #3589 Version macro for allocate_at_least
  • Fixed bugs:
    • Fixed the ios_base constants (e.g. ios_base::binary, ios_base::failbit, ios_base::hex) to have the correct bitmask types. #3405
    • Fixed compiler errors found with Clang 16. #3483
    • Fixed <ranges> to avoid using list-initialization when the difference between braces and parentheses is observable. #3493
    • Fixed pmr::unsynchronized_pool_resource to respect pmr::pool_options::max_blocks_per_chunk when it's smaller than the default initial number of blocks per chunk. #3510
    • Fixed technically undefined behavior in <regex> and <sstream> found by Clang/LLVM's Undefined Behavior Sanitizer (UBSan). #3452
    • Fixed compiler errors when calling ranges::equal with ranges involving views::iota. #3551
    • Fixed the STL's iterator unwrapping machinery to avoid requiring a _Prevent_inheriting_unwrap typedef. #3566
    • Fixed spurious warnings from Clang's -Wzero-as-null-pointer-constant when comparing the spaceship operator's return types (partial_ordering, weak_ordering, strong_ordering) with literal 0. #3581
    • Fixed bind() function objects to have constrained function call operators, so they interact properly with is_invocable and related scenarios. #3577
    • Reverted #2654 (which affected <future>'s use of <ppltasks.h> in Desktop XAML apps) because it introduced an ole32.dll dependency that broke multiple scenarios. #3607
      • We backported this revert to VS 2022 17.6.
    • Fixed views::cartesian_product to avoid compiler errors in pathological scenarios. #3609
    • Fixed incorrect results for ranges larger than 4 GB passed to the vectorized implementations of min_element(), max_element(), and minmax_element(). #3619
      • This also affected ranges::min_element, ranges::max_element, ranges::minmax_element, ranges::min, ranges::max, ranges::minmax, and the min(), max(), and minmax() overloads for initializer_list.
      • This fixed a regression that was introduced by #2447 #2821 #2825 in VS 2022 17.4.
    • Added a compiler bug workaround for MSVC in shared_ptr's operator<=>. #3647
      • This avoids compiler errors when comparing shared_ptr<const int> to shared_ptr<void>.
    • Added a space to chrono::ambiguous_local_time's message to exactly match the Standard. #3650
    • Fixed compiler errors when formatting unusual chrono::duration types. #3649
    • Fixed optional::transform() to avoid terminating when the callable object throws an exception. #3668
    • Fixed <charconv> floating-point from_chars() to correctly handle two scenarios involving exponents with large absolute values. #3670
    • Fixed iostreams floating-point parsing to produce correct results for many different scenarios. #3364
    • Fixed compiler errors when importing the Standard Library Modules and calling typeid(T).name(). #3677
    • Fixed some nasty corner cases in cartesian_product_view. #3678
    • Fixed some issues with parsing numbers with grouping separators. #3684
    • Fixed a bug that could result in unordered_meow containers allocating too few buckets. #3687
  • Improved performance:
    • Slightly optimized mutex and recursive_mutex construction by avoiding a Windows API call. #3522
    • Slightly optimized unique_ptr move assignment by avoiding an unnecessary branch. #3540
    • Optimized chrono::time_zone::to_sys and chrono::time_zone::to_local, with a speedup of approximately 3x (times, not percent). #3579
    • Optimized type_index::operator<=> to avoid calling the comparison function twice. #3600
    • Inserted the VZEROUPPER instruction at the end of every AVX2 codepath in the STL's vectorized algorithms, improving performance in non-optimized debug mode when the compiler doesn't automatically insert this instruction. #3630
    • Optimized the constructors system_error(error_code) and system_error(int, const error_category&). #3635
  • Improved throughput:
    • <optional> and <variant> now include fewer headers. #3624
    • Moved internal machinery into <regex> where it's needed. #3625
    • C++20 <chrono> now avoids including <algorithm>. #3626
    • <compare> now avoids including <bit>. #3627
    • Refactored a central internal header so that the rest of the STL includes fewer headers and provides less machinery beyond what's required. #3623 #3654
      • Common source-breaking impact:
        • Need to include <cstdlib> for exit, quick_exit, etc.
        • Need to include <initializer_list> for initializer_list.
          • Sometimes initializer_list is used implicitly when only braces appear in the source code.
        • Need to include <functional> for unary_function and binary_function.
          • Note that unary_function and binary_function were deprecated in C++11 and removed in C++17, so it's best to stop using them completely.
      • Uncommon source-breaking impact:
        • Need to include <memory> for addressof.
        • Need to include <functional> for less, less_equal, greater, greater_equal, equal_to, not_equal_to, plus, minus, and multiplies.
    • When the STL needs to call swap via Argument-Dependent Lookup, it now does so directly; the internal helper function _Swap_adl has been removed. #3700
  • Enhanced behavior:
    • Silenced CodeQL warnings. #3489 #3585
    • Silenced occurrences (in bitset::reference and test code) of MSVC's new off-by-default warning C5267 for deprecated implicit copy constructors/assignment operators. #3497
    • Enabled <source_location> for Clang. #3584
    • Removed the non-Standard xtime type from <chrono>. #3594
    • Added static_asserts to containers, container adaptors, and allocator to improve the error messages when they're given non-object types. #2436 #3660
      • allocator<void> is still permitted as a special case.
  • Improved test coverage:
    • Added test coverage with Clang/LLVM's Undefined Behavior Sanitizer (UBSan). #3452
    • Added more tests for views::empty, views::iota, views::istream, views::repeat, and views::single. #3553
    • Fixed nonconformant code in the test for Standard Library Header Units and Modules. #3588
    • Added test coverage for C++23's customization point objects. #3610
    • Added more tests for ranges::ref_view, ranges::subrange, views::common, views::filter, views::join, views::reverse, and views::transform. #3612
  • Code cleanups:
  • Improved documentation:
    • Added documentation about the STL's import library. #2141
  • Infrastructure improvements:
    • The internal test runner now understands compile-only tests and libcxx/expected_results.txt. Consequently, (1) compile-only tests (test.compile.pass.cpp) no longer need a redundant int main() {} // COMPILE-ONLY, and (2) we no longer need to redundantly update libcxx/skipped_tests.txt (which has been removed) identically to libcxx/expected_results.txt. #3484
    • Enforced the usage of only core headers when building the STL's import library. #3621
    • Updated dependencies. #3490 #3651 #3711
      • Updated build compiler to VS 2022 17.7 Preview 1 (17.6 now required).
      • Updated Clang to 16.0.1 (now required).
      • Updated CMake to 3.26.0 (now required).
      • Updated Python to 3.11.3.
      • Updated Boost.Math to 1.82.0. #3657
  • Updated _MSVC_STL_UPDATE. #3518 #3643 #3680

VS 2022 17.6

  • Merged C++23 features:
  • Merged partial C++23 features:
    • P2165R4 Compatibility Between tuple, pair, And tuple-like Objects:
    • P2321R2 zip:
      • views::zip_transform. #3322
      • Note: views::adjacent and views::adjacent_transform remain to be implemented.
  • Merged LWG issue resolutions:
    • LWG-3515 #3236 [stacktrace.basic.nonmem]: operator<< should be less templatized
    • LWG-3545 #3242 std::pointer_traits should be SFINAE-friendly
    • LWG-3594 #3276 inout_ptr - inconsistent release() in destructor
    • LWG-3629 #3272 make_error_code and make_error_condition are customization points
    • LWG-3646 #3261 std::ranges::view_interface::size returns a signed type
    • LWG-3717 #3266 common_view::end should improve random_access_range case
    • LWG-3736 #3318 move_iterator missing disable_sized_sentinel_for specialization
    • LWG-3737 #3320 take_view::sentinel should provide operator-
    • LWG-3743 #3269 ranges::to's reserve may be ill-formed
    • LWG-3746 #3265 optional's spaceship with U with a type derived from optional causes infinite constraint meta-recursion
    • LWG-3769 #3459 basic_const_iterator::operator== causes infinite constraint recursion
    • LWG-3772 #3462 repeat_view's piecewise constructor is missing preconditions
    • LWG-3778 #3332 vector<bool> missing exception specifications
    • LWG-3785 #3319 ranges::to is over-constrained on the destination type being a range
    • LWG-3798 #3359 Rvalue reference and iterator_category
    • LWG-3810 #3421 CTAD for std::basic_format_args
    • LWG-3823 #3231 Unnecessary precondition for is_aggregate
    • LWG-3848 #3410 slide_view missing base accessor
    • LWG-3850 #3423 views::as_const on empty_view<T> should return empty_view<const T>
    • LWG-3853 #3468 basic_const_iterator<volatile int*>::operator-> is ill-formed
  • Merged proposed resolutions for LWG issues (not yet accepted for the C++ Working Draft, but we've chosen to implement this speculatively):
    • LWG-3857 #3348 basic_string_view should allow explicit conversion when only traits vary
    • LWG-3867 #3367 Should std::basic_osyncstream's move assignment operator be noexcept?
  • Fixed bugs:
    • Fixed linker errors when using time_put<wchar_t> from the Standard Library Modules. #3232
    • Fixed another unintentionally dllexported symbol in the import library. #3233
      • This would emit a spurious message "Creating library meow.lib and object meow.exp" (while building meow.exe) when using <stacktrace> or importing the Standard Library Modules.
    • Fixed a binary compatibility break in basic_string, which could lead to missing null terminators causing crashes and other runtime misbehavior, when linking code that was built with different versions of the STL. #3235
      • This ABI break was introduced by #1735 activating the Small String Optimization for constexpr basic_string in VS 2022 17.4.
      • The affected scenarios involved mixing VS 2022 17.3 (or earlier) with VS 2022 17.4 (or later, until this fix).
      • We backported this fix to VS 2022 17.4.5 and VS 2022 17.5.
    • Fixed a binary compatibility break in ppltasks.cpp powering std::async(), which could lead to crashes caused by an invalid_operation exception slamming into noexcept. #3255
      • This ABI break was introduced by #2654, and appeared in VS 2022 17.4 when the VCRedist was "unlocked".
      • The affected scenarios involved building with VS 2015 (or possibly early versions of VS 2017), using "Single-Threaded Apartments", and running on an end user's machine with the VS 2022 17.4 VCRedist installed.
      • We backported this fix to VS 2022 17.4.5 and VS 2022 17.5.
    • Fixed incorrect results from find(), count(), ranges::find(), and ranges::count(). #3247
      • This fixed a regression that was introduced by #2434 in VS 2022 17.3.
      • The affected scenarios involved mixing certain signed and unsigned types; for example, finding/counting occurrences of the int -1 in a range of unsigned int elements should consider the element 0xFFFF'FFFFu to be equal (due to C++'s usual arithmetic conversions), but it was incorrectly considered to be non-equal.
      • We backported this fix to VS 2022 17.4.5 and VS 2022 17.5.
    • Fixed the visualizer for optional<T> to work when T has a custom visualizer. #3243
    • Fixed compiler warnings when passing long double to copysign(). #3253
    • Re-enabled ASan (Address Sanitizer) annotations in <string> after fixing significant bugs. #3164
      • Also fixed ASan annotations in <vector> that were failing when pmr::vector was used with pmr::monotonic_buffer_resource on x86.
    • Fixed compiler errors when passing ranges types to std::copy(). #3270
    • Fixed shared_future<void>'s move assignment operator to be noexcept as required by the Standard. #3284
    • Fixed Clang compiler errors involving intrinsics by including <intrin.h>, which is a header that Clang recognizes and supports. #3285
    • Fixed numeric_limits to correctly report that is_signed is true for the STL's internal 128-bit signed-integer-class type. #3291
    • Fixed <stacktrace> to correctly pass SYMOPT_FAIL_CRITICAL_ERRORS to the Windows API. #3292
    • Fixed <charconv> (and headers that include it, like <chrono> and <format>) to avoid emitting warning C4365 "signed/unsigned mismatch" when being compiled with /J. #3295
      • Note: We strongly discourage any use of the /J compiler option, as it's a recipe for One Definition Rule violations and it doesn't improve Standard conformance.
    • Fixed ranges::cbegin, ranges::cend, ranges::crbegin, ranges::crend, and ranges::cdata to behave like their non-const counterparts when given array rvalues. #3316
    • Added compiler bug workarounds:
      • For Clang in <expected>. #3326
      • For Clang in <ranges>. #3328
      • For MSVC modules in <filesystem>. #3331
    • Fixed constexpr basic_string to correctly start the lifetimes of its elements, avoiding compiler errors. #3334
    • Fixed views::istream constraints to precisely follow the Standard. #3335
    • Implemented C++17's parallel specialized <memory> algorithms. #3145
      • These were mistakenly omitted when P0040R3 Extending Memory Management Tools and P0024R2 Parallel Algorithms were implemented (in VS 2017 15.3 and 15.7, respectively).
    • Fixed vector<bool, Alloc> on 32-bit platforms with 64-bit difference_types to support storing more than 232 bits. #3342
    • Fixed a compiler error when calling ranges::prev on an iota_view iterator in debug mode. #3356
    • Fixed ranges::minmax to avoid moving from an element twice when called with a single-element range of move_iterators. #3366
    • Fixed a minor conformance issue in the std.ixx Standard Library Module. #3373
      • When module; introduces a global module fragment, it is required to be the first thing in the file other than comments, although MSVC doesn't enforce this rule yet.
    • Changed the STL's usage of a compiler-specific custom attribute to defend against macros. #3380
    • Fixed Clang -Wdeprecated warnings that said "out-of-line definition of constexpr static data member is redundant in C++17 and is deprecated". #3381
    • Changed vformat_to() to instantiate its machinery in a lazier way. #3403
      • When merely including <format> or <chrono>, this avoids instantiating dynamic initializers for facet IDs, and improves throughput slightly.
  • Improved performance:
    • Avoided constructing unnecessary strings in locale::operator==(). #3250
    • Activated count()'s vectorized implementation for more eligible iterators in C++14/17 modes. #3262
    • Activated the vectorized implementations of find(), count(), ranges::find(), and ranges::count() for more scenarios involving pointer elements. #3267
    • Optimized <atomic> for ARM64, massively improving load-acquire and store-release (measured 14.1x to 23.8x speedups - times, not percent) and significantly improving sequentially consistent stores (measured 1.58x speedup). #3399
    • ranges::find now calls memchr() in more situations (when the vectorized implementation isn't available). #3386
  • Improved throughput:
    • Moved user-defined literals for the STL's internal 128-bit integer-class types from product code to test code. #3252
    • Removed unnecessary operator== and operator!= overloads for internal types in C++20 mode. #3256
    • Used if constexpr instead of overloads in internal machinery. #3389
  • Enhanced behavior:
    • The STL now supports /clr for C++11 multithreading (mutex, condition_variable, future, etc.) and C++17 parallel algorithms. Additionally, the STL now allows /clr to be used in C++20 mode. #3194 #3201
      • See tracking issue #3193 for a list of compiler bugs that affect these newly enabled /clr scenarios.
    • Added visualizers for error_category and error_code. #3204
    • Improved the output of source_location::function_name(). #3206
      • For example, it now returns "int __cdecl square(int)" instead of "square".
    • When iterator debugging detects bogus usage of an invalidated vector iterator, it now displays an assertion message instead of abruptly crashing. #3282
    • Changed <mutex> to use scope guards instead of throw;, making debugging easier when exceptions are thrown. #3321
    • Strengthened the exception specifications for:
      • mutex::unlock(), recursive_mutex::unlock(), and unique_lock's move assignment operator. #3321
      • Various member functions and swap() overloads for stream types. #3314
      • Various non-member and member functions in <condition_variable>, <mutex>, <shared_mutex>, and <thread>. #3388
    • Added modules/modules.json to support build systems. #3358 #3488
    • Refactored ranges::minmax and ranges::minmax_element to detect the single-element case naturally. #3384
    • Changed the STL's user-defined literals to be consistently defined as operator""meow without a space, because CWG-2521 is deprecating the form operator"" woof with a space. #3453
  • Improved documentation:
    • Clarified the error message when including the internal header <__msvc_cxx_stdatomic.hpp> in C mode. #3192
  • Improved test coverage:
    • Enabled <stdatomic.h> test coverage for Clang. #3186
    • Updated the modules tests after a compiler bugfix for source_location. #3339
    • Added more tests for views::elements. #3350
    • Updated our LLVM submodule reference, including new tests. #3344 #3357
    • Added more tests for views::drop, views::drop_while, views::take, and views::take_while. #3390
  • Code cleanups:
    • Removed compiler bug workarounds. #3202 #3288 #3351 #3350
    • Removed comments that were citing proposed resolutions for LWG issues, now that those issues have been officially resolved by the November 2022 and February 2023 meetings. #3238 #3461
    • Improved consistency in preprocessor comments. #3208
    • Simplified a line in experimental::filesystem::recursive_directory_iterator::operator++(). #3279
    • Various cleanups (described in detail in the PRs, not repeated here). #3293 #3300
    • Removed unused internal machinery. #3299
    • Simplified types by defaulting some of their special member functions:
      • promise and packaged_task. #3315
      • shared_mutex, shared_timed_mutex, and shared_lock. #3352
    • Changed more temporary objects to be constructed with braces instead of parentheses. #3277
    • Updated comments after a compiler bug was fixed. #3394
    • Updated tests and separately compiled sources to directly use the [[nodiscard]] attribute. #3397
    • Updated notes for skipped tests in the libcxx test suite. #3464
  • Infrastructure improvements:
    • Added GitHub Actions to automatically add PR cards to the Code Reviews project. #3393
    • Fixed the build system to properly pass options when assembling the "alias objects". #3402
    • Updated dependencies. #3202 #3288 #3340 #3351 #3467
      • Updated build compiler to VS 2022 17.5 Preview 6 (now required).
      • Updated CMake to 3.25 (now required).
      • Updated Python to 3.11.2.
      • Updated Boost.Math to 1.81.0. #3312
  • Updated _MSVC_STL_UPDATE. #3191 #3264 #3362 #3395

Older Versions