Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
20 commits
Select commit Hold shift + click to select a range
cbe2ee9
Update tests for upcoming compiler changes to `consteval` (#5960)
StephanTLavavej Dec 12, 2025
641410d
Use division by 100 in `to_string` for integers (#5691)
AlexGuteniev Jan 8, 2026
7364b42
Implement P3016R6 Resolve Inconsistencies In `begin`/`end` For `valar…
vmichal Jan 8, 2026
58d2910
Enable vectorized minmax_element using Neon on ARM64 (#5949)
hazzlim Jan 8, 2026
eec1e28
The Uncanny xmath Overhaul (#5959)
StephanTLavavej Jan 8, 2026
649a76a
`<regex>`: Simplify unwinding (#5961)
muellerj3 Jan 8, 2026
12b5859
Update working draft revision to N5032 (#5967)
TPPPP72 Jan 8, 2026
e7d5bf7
`<atomic>`: drop `_Atomic_reinterpret_as` (#5973)
AlexGuteniev Jan 8, 2026
b3f2c67
Vectorize `replace_copy` for x64 / x86 manually (#5980)
AlexGuteniev Jan 8, 2026
ba946a1
updated _MSVC_STL_UPDATE to January 2026 (#5985)
chai-shai Jan 8, 2026
4634ad4
Fix no-match handling when calling `memchr`/`wmemchr` on ARM64EC (#5993)
hazzlim Jan 8, 2026
32db7bd
Toolset update: MSVC Compiler 19.50.35722 (#6011)
StephanTLavavej Jan 15, 2026
f10833d
STL.natvis: Add `c_str` intrinsic function (#5997)
gregg-miskelly Jan 15, 2026
44821d9
Add Neon implementation of minmax (#5963)
hazzlim Jan 15, 2026
9553d3a
Add Neon implementation of `find` for ARM64 targets (#6003)
hazzlim Jan 15, 2026
e98005d
`<regex>`: Revise complexity limit (#6005)
muellerj3 Jan 15, 2026
46d99b6
Remove workarounds for ancient Clang versions (#6012)
StephanTLavavej Jan 15, 2026
c865e85
Update llvm-project (#6006)
StephanTLavavej Jan 15, 2026
7dc8050
Merge branch 'main' into merge-flat-map
StephanTLavavej Jan 15, 2026
fd076f6
Update libcxx failures.
StephanTLavavej Jan 15, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
# Copyright (c) Microsoft Corporation.
# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception

cmake_minimum_required(VERSION 4.1.1)
cmake_minimum_required(VERSION 4.1.2)

set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY)
project(msvc_standard_libraries LANGUAGES CXX)

if(CMAKE_CXX_COMPILER_VERSION VERSION_LESS "19.50.35720")
message(FATAL_ERROR "The STL must be built with MSVC Compiler 19.50.35720 or later.")
if(CMAKE_CXX_COMPILER_VERSION VERSION_LESS "19.50.35722")
message(FATAL_ERROR "The STL must be built with MSVC Compiler 19.50.35722 or later.")
endif()

include(CheckCXXSourceCompiles)
Expand Down
6 changes: 3 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ issue. The [bug tag][] and [enhancement tag][] are being populated.

# Goals

We're implementing the latest C++ Working Draft, currently [N5014][], which will eventually become the next C++
We're implementing the latest C++ Working Draft, currently [N5032][], which will eventually become the next C++
International Standard. The terms Working Draft (WD) and Working Paper (WP) are interchangeable; we often
informally refer to these drafts as "the Standard" while being aware of the difference. (There are other relevant
Standards; for example, supporting `/std:c++14` and `/std:c++17` involves understanding how the C++14 and C++17
Expand Down Expand Up @@ -151,7 +151,7 @@ Just try to follow these rules, so we can spend more time fixing bugs and implem
- "Windows 11 SDK (10.0.26100)" or later
- "C++ Clang tools for Windows (20.1.8 - x64/x86)"
- *Optional, see Note 2 below:* "MSVC Build Tools for ARM64/ARM64EC (Latest)"
* Install [Python][] 3.14.0 or later.
* Install [Python][] 3.14.2 or later.
+ Select "Add python.exe to PATH" if you want to follow the instructions below that invoke `python`.
Otherwise, you should be familiar with alternative methods.

Expand Down Expand Up @@ -584,7 +584,7 @@ SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
[LWG issues]: https://cplusplus.github.io/LWG/lwg-toc.html
[LWG tag]: https://github.com/microsoft/STL/issues?q=is%3Aopen+is%3Aissue+label%3ALWG
[Microsoft Open Source Code of Conduct]: https://opensource.microsoft.com/codeofconduct/
[N5014]: https://wg21.link/N5014
[N5032]: https://wg21.link/N5032
[NOTICE.txt]: NOTICE.txt
[STL-CI-badge]: https://dev.azure.com/vclibs/STL/_apis/build/status%2FSTL-CI?branchName=main "STL-CI"
[STL-CI-link]: https://dev.azure.com/vclibs/STL/_build/latest?definitionId=4&branchName=main
Expand Down
38 changes: 24 additions & 14 deletions azure-devops/build-benchmarks.yml
Original file line number Diff line number Diff line change
Expand Up @@ -14,29 +14,39 @@ parameters:
type: string

steps:
- script: |
if exist "$(benchmarkBuildOutputLocation)\${{ parameters.compiler }}" (
rmdir /S /Q "$(benchmarkBuildOutputLocation)\${{ parameters.compiler }}"
)
call "$(vsDevCmdBat)" -host_arch=${{ parameters.hostArch }} -arch=${{ parameters.targetArch }} -no_logo
cmake -G Ninja ^
-DCMAKE_CXX_COMPILER=${{ parameters.compiler }} ^
-DCMAKE_BUILD_TYPE=Release ^
-DSTL_BINARY_DIR="$(buildOutputLocation)" ^
-DVCLIBS_TARGET_ARCHITECTURE=${{ parameters.targetPlatform }} ^
-S $(Build.SourcesDirectory)/benchmarks -B "$(benchmarkBuildOutputLocation)\${{ parameters.compiler }}"
- task: PowerShell@2
displayName: 'Configure Benchmarks for ${{ parameters.compiler }}'
inputs:
pwsh: true
targetType: inline
script: |
$PSNativeCommandUseErrorActionPreference = $true
if (Test-Path -LiteralPath "$(benchmarkBuildOutputLocation)\${{ parameters.compiler }}") {
Remove-Item -LiteralPath "$(benchmarkBuildOutputLocation)\${{ parameters.compiler }}" -Recurse -Force
}
& "$(launchVsDevShell)" -HostArch ${{ parameters.hostArch }} -Arch ${{ parameters.targetArch }}
cmake -G Ninja `
-DCMAKE_CXX_COMPILER=${{ parameters.compiler }} `
-DCMAKE_BUILD_TYPE=Release `
-DSTL_BINARY_DIR="$(buildOutputLocation)" `
-DVCLIBS_TARGET_ARCHITECTURE=${{ parameters.targetPlatform }} `
-S $(Build.SourcesDirectory)/benchmarks -B "$(benchmarkBuildOutputLocation)\${{ parameters.compiler }}"
timeoutInMinutes: 2
env: { TMP: $(tmpDir), TEMP: $(tmpDir) }
# TRANSITION, we currently only build the benchmarks with Clang for x64
condition: >
and(succeeded(), ${{ parameters.buildBenchmarks }},
not(and(eq('${{ parameters.compiler }}', 'clang-cl'),
not(eq('${{ parameters.targetPlatform }}', 'x64')))))
- script: |
call "$(vsDevCmdBat)" -host_arch=${{ parameters.hostArch }} -arch=${{ parameters.targetArch }} -no_logo
cmake --build "$(benchmarkBuildOutputLocation)\${{ parameters.compiler }}"
- task: PowerShell@2
displayName: 'Build Benchmarks for ${{ parameters.compiler }}'
inputs:
pwsh: true
targetType: inline
script: |
$PSNativeCommandUseErrorActionPreference = $true
& "$(launchVsDevShell)" -HostArch ${{ parameters.hostArch }} -Arch ${{ parameters.targetArch }}
cmake --build "$(benchmarkBuildOutputLocation)\${{ parameters.compiler }}"
timeoutInMinutes: 2
env: { TMP: $(tmpDir), TEMP: $(tmpDir) }
# TRANSITION, we currently only build the benchmarks with Clang for x64
Expand Down
22 changes: 17 additions & 5 deletions azure-devops/checkout-self.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,16 +2,28 @@
# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception

steps:
- script: |
if exist "$(tmpDir)" (rmdir /S /Q $(tmpDir))
mkdir $(tmpDir)
- task: PowerShell@2
displayName: 'Setup TMP Directory'
inputs:
pwsh: true
targetType: inline
script: |
$PSNativeCommandUseErrorActionPreference = $true
if (Test-Path -LiteralPath "$(tmpDir)") {
Remove-Item -LiteralPath "$(tmpDir)" -Recurse -Force
}
mkdir "$(tmpDir)" -Force | Out-Null
- checkout: self
clean: true
submodules: false
fetchDepth: 1
fetchTags: false
retryCountOnTaskFailure: 4
- script: |
git clean --quiet -x -d -f -f
- task: PowerShell@2
displayName: 'Clean After Checkout'
inputs:
pwsh: true
targetType: inline
script: |
$PSNativeCommandUseErrorActionPreference = $true
git clean --quiet -x -d -f -f
46 changes: 28 additions & 18 deletions azure-devops/cmake-configure-build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -27,28 +27,38 @@ parameters:
- '--run-shard=$(System.JobPositionInPhase)'

steps:
- script: |
if exist "$(buildOutputLocation)" (
rmdir /S /Q "$(buildOutputLocation)"
)
call "$(vsDevCmdBat)" -host_arch=${{ parameters.hostArch }} -arch=${{ parameters.targetArch }} -no_logo
cmake -G Ninja ^
-DCMAKE_CXX_COMPILER=cl ^
-DCMAKE_BUILD_TYPE=Release ^
-DLIT_FLAGS=${{ join(';', parameters.litFlags) }} ^
-DSTL_USE_ANALYZE=${{ parameters.analyzeBuild }} ^
-DSTL_ASAN_BUILD=${{ parameters.asanBuild }} ^
-DCONFIGURE_TESTING=${{ parameters.configureTesting }} ^
-DTESTS_BUILD_ONLY=${{ parameters.testsBuildOnly }} ^
-DVCLIBS_TARGET_ARCHITECTURE=${{ parameters.targetPlatform }} ^
-S $(Build.SourcesDirectory) -B "$(buildOutputLocation)"
- task: PowerShell@2
displayName: 'Configure STL'
inputs:
pwsh: true
targetType: inline
script: |
$PSNativeCommandUseErrorActionPreference = $true
if (Test-Path -LiteralPath "$(buildOutputLocation)") {
Remove-Item -LiteralPath "$(buildOutputLocation)" -Recurse -Force
}
& "$(launchVsDevShell)" -HostArch ${{ parameters.hostArch }} -Arch ${{ parameters.targetArch }}
cmake -G Ninja `
-DCMAKE_CXX_COMPILER=cl `
-DCMAKE_BUILD_TYPE=Release `
-DLIT_FLAGS="${{ join(';', parameters.litFlags) }}" `
-DSTL_USE_ANALYZE=${{ parameters.analyzeBuild }} `
-DSTL_ASAN_BUILD=${{ parameters.asanBuild }} `
-DCONFIGURE_TESTING=${{ parameters.configureTesting }} `
-DTESTS_BUILD_ONLY=${{ parameters.testsBuildOnly }} `
-DVCLIBS_TARGET_ARCHITECTURE=${{ parameters.targetPlatform }} `
-S $(Build.SourcesDirectory) -B "$(buildOutputLocation)"
timeoutInMinutes: 2
env: { TMP: $(tmpDir), TEMP: $(tmpDir) }
- script: |
call "$(vsDevCmdBat)" -host_arch=${{ parameters.hostArch }} -arch=${{ parameters.targetArch }} -no_logo
cmake --build "$(buildOutputLocation)"
- task: PowerShell@2
displayName: 'Build STL'
inputs:
pwsh: true
targetType: inline
script: |
$PSNativeCommandUseErrorActionPreference = $true
& "$(launchVsDevShell)" -HostArch ${{ parameters.hostArch }} -Arch ${{ parameters.targetArch }}
cmake --build "$(buildOutputLocation)"
timeoutInMinutes: 5
condition: and(succeeded(), ${{ parameters.buildStl }})
env: { TMP: $(tmpDir), TEMP: $(tmpDir) }
8 changes: 4 additions & 4 deletions azure-devops/config.yml
Original file line number Diff line number Diff line change
Expand Up @@ -5,16 +5,16 @@

variables:
- name: poolName
value: 'Stl-2025-12-09T1433-x64-Pool'
value: 'Stl-2026-01-13T1248-x64-Pool'
readonly: true
- name: arm64PoolName
value: 'Stl-2025-12-09T1433-arm64-Pool'
value: 'Stl-2026-01-13T1248-arm64-Pool'
readonly: true
- name: poolDemands
value: 'EnableSpotVM -equals false'
readonly: true
- name: vsDevCmdBat
value: 'C:\Program Files\Microsoft Visual Studio\18\Insiders\Common7\Tools\VsDevCmd.bat'
- name: launchVsDevShell
value: 'C:\Program Files\Microsoft Visual Studio\18\Insiders\Common7\Tools\Launch-VsDevShell.ps1'
readonly: true
- name: tmpDir
value: 'C:\stlTemp'
Expand Down
2 changes: 1 addition & 1 deletion azure-devops/create-1es-hosted-pool.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ if ($Arch -ieq 'x64') {
} else {
# CPP_STL_GitHub has quota for 672 cores (21 VMs) in westcentralus, not currently used.
$AvailableLocations = @('eastus2', 'northeurope') # Locations where CPP_STL_GitHub has quota for 1024 cores (32 VMs).
$AvailableLocationIdx = 3 # Increment for each new pool, to cycle through the available locations.
$AvailableLocationIdx = 4 # Increment for each new pool, to cycle through the available locations.
$Location = $AvailableLocations[$AvailableLocationIdx % $AvailableLocations.Length]
$VMSize = 'Standard_D32ps_v6'
$PoolSize = 32
Expand Down
42 changes: 29 additions & 13 deletions azure-devops/format-validation.yml
Original file line number Diff line number Diff line change
Expand Up @@ -9,26 +9,41 @@ jobs:
displayName: 'Validation'
steps:
- template: checkout-self.yml
- script: |
if exist "$(validationBuildOutputLocation)" (
rmdir /S /Q "$(validationBuildOutputLocation)"
)
call "$(vsDevCmdBat)" -host_arch=x64 -arch=x64 -no_logo
cmake -G Ninja -S $(Build.SourcesDirectory)/tools -B "$(validationBuildOutputLocation)"
cmake --build "$(validationBuildOutputLocation)"
- task: PowerShell@2
displayName: 'Build Validation Tools'
inputs:
pwsh: true
targetType: inline
script: |
$PSNativeCommandUseErrorActionPreference = $true
if (Test-Path -LiteralPath "$(validationBuildOutputLocation)") {
Remove-Item -LiteralPath "$(validationBuildOutputLocation)" -Recurse -Force
}
& "$(launchVsDevShell)" -HostArch x64 -Arch x64
cmake -G Ninja -S $(Build.SourcesDirectory)/tools -B "$(validationBuildOutputLocation)"
cmake --build "$(validationBuildOutputLocation)"
timeoutInMinutes: 5
env: { TMP: $(tmpDir), TEMP: $(tmpDir) }
- script: |
call "$(vsDevCmdBat)" -host_arch=x64 -arch=x64 -no_logo
cmake --build "$(validationBuildOutputLocation)" --target run-format
- task: PowerShell@2
displayName: 'clang-format Files'
inputs:
pwsh: true
targetType: inline
script: |
$PSNativeCommandUseErrorActionPreference = $true
& "$(launchVsDevShell)" -HostArch x64 -Arch x64
cmake --build "$(validationBuildOutputLocation)" --target run-format
timeoutInMinutes: 5
env: { TMP: $(tmpDir), TEMP: $(tmpDir) }
- script: |
call "$(vsDevCmdBat)" -host_arch=x64 -arch=x64 -no_logo
cmake --build "$(validationBuildOutputLocation)" --target run-validate
- task: PowerShell@2
displayName: 'Validate Files'
inputs:
pwsh: true
targetType: inline
script: |
$PSNativeCommandUseErrorActionPreference = $true
& "$(launchVsDevShell)" -HostArch x64 -Arch x64
cmake --build "$(validationBuildOutputLocation)" --target run-validate
timeoutInMinutes: 2
env: { TMP: $(tmpDir), TEMP: $(tmpDir) }
- task: PowerShell@2
Expand All @@ -37,6 +52,7 @@ jobs:
pwsh: true
targetType: inline
script: |
$PSNativeCommandUseErrorActionPreference = $true
$TempSubDir = Join-Path ([System.IO.Path]::GetTempPath()) ([System.IO.Path]::GetRandomFileName())
mkdir $TempSubDir -Force | Out-Null
$DiffFile = Join-Path $TempSubDir 'format.diff'
Expand Down
29 changes: 27 additions & 2 deletions azure-devops/provision-image.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -67,9 +67,9 @@ $PowerShellArgs = @('/quiet', '/norestart')

# https://www.python.org
if ($Provisioning_x64) {
$PythonUrl = 'https://www.python.org/ftp/python/3.14.0/python-3.14.0-amd64.exe'
$PythonUrl = 'https://www.python.org/ftp/python/3.14.2/python-3.14.2-amd64.exe'
} else {
$PythonUrl = 'https://www.python.org/ftp/python/3.14.0/python-3.14.0-arm64.exe'
$PythonUrl = 'https://www.python.org/ftp/python/3.14.2/python-3.14.2-arm64.exe'
}
$PythonArgs = @('/quiet', 'InstallAllUsers=1', 'PrependPath=1', 'CompileAll=1', 'Include_doc=0')

Expand Down Expand Up @@ -137,6 +137,26 @@ Function DownloadAndInstall {
}
}

<#
.SYNOPSIS
Enables native NVMe support.

.DESCRIPTION
Native NVMe support is opt-in for Windows Server 2025.
TRANSITION, this will be enabled by default for the next version of Windows Server.
#>
Function EnableNativeNVMe {
$registryKey = 'HKLM:\SYSTEM\CurrentControlSet\Policies\Microsoft\FeatureManagement\Overrides'
$valueName = '1176759950'
$valueData = 1

if (!(Test-Path $registryKey)) {
New-Item -Path $registryKey -Force | Out-Null
}

New-ItemProperty -Path $registryKey -Name $valueName -Value $valueData -PropertyType DWORD -Force | Out-Null
}

Write-Host "Old PowerShell version: $($PSVersionTable.PSVersion)"

# Print the Windows version, so we can verify whether Patch Tuesday has been picked up.
Expand All @@ -161,6 +181,11 @@ Write-Host 'Enabling long paths...'
New-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\Control\FileSystem' -Name 'LongPathsEnabled' `
-Value 1 -PropertyType DWORD -Force | Out-Null

if ($Provisioning_x64) {
Write-Host 'Enabling native NVMe...'
EnableNativeNVMe
}

# Tell create-1es-hosted-pool.ps1 that we succeeded.
Write-Host 'PROVISION_IMAGE_SUCCEEDED'

Expand Down
13 changes: 9 additions & 4 deletions azure-devops/run-tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -13,13 +13,18 @@ parameters:
- name: runTesting
type: boolean
steps:
- script: |
call "$(vsDevCmdBat)" -host_arch=${{ parameters.hostArch }} -arch=${{ parameters.targetArch }} -no_logo
ninja --verbose -k 0 ${{ parameters.testTargets }}
- task: PowerShell@2
displayName: 'Run Tests'
inputs:
pwsh: true
workingDirectory: $(buildOutputLocation)
targetType: inline
script: |
$PSNativeCommandUseErrorActionPreference = $true
& "$(launchVsDevShell)" -HostArch ${{ parameters.hostArch }} -Arch ${{ parameters.targetArch }}
ninja --verbose -k 0 ${{ parameters.testTargets }}
timeoutInMinutes: 30
condition: and(succeeded(), ${{ parameters.runTesting }})
workingDirectory: $(buildOutputLocation)
env: { TMP: $(tmpDir), TEMP: $(tmpDir) }
- task: PublishTestResults@2
displayName: 'Publish Tests'
Expand Down
3 changes: 2 additions & 1 deletion benchmarks/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
# Copyright (c) Microsoft Corporation.
# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception

cmake_minimum_required(VERSION 4.1.1)
cmake_minimum_required(VERSION 4.1.2)
project(msvc_standard_libraries_benchmarks LANGUAGES CXX)

if(DEFINED STL_BINARY_DIR)
Expand Down Expand Up @@ -113,6 +113,7 @@ add_benchmark(find_and_count src/find_and_count.cpp)
add_benchmark(find_first_of src/find_first_of.cpp)
add_benchmark(has_single_bit src/has_single_bit.cpp)
add_benchmark(includes src/includes.cpp)
add_benchmark(integer_to_string src/integer_to_string.cpp)
add_benchmark(iota src/iota.cpp)
add_benchmark(is_sorted_until src/is_sorted_until.cpp)
add_benchmark(locale_classic src/locale_classic.cpp)
Expand Down
Loading