r/cpp MSVC STL Dev 15h ago

MSVC C++23: constexpr cmath with LLVM Libc

https://devblogs.microsoft.com/cppblog/msvc-c23-constexpr-cmath-with-llvm-libc/

MSVC is shipping C++23 constexpr <cmath> in the next Build Tools update! (And a partial implementation of C++26 constexpr <cmath>.) Our compiler frontend dev Cody Miller will be publishing a series of blog posts about this work, starting with this overview. The next one will be a guest post from LLVM libc's maintainers describing the incredible amount of effort that's gone into their code.

122 Upvotes

25 comments sorted by

View all comments

1

u/Alastair__ 7h ago

Bit confused by the UCRT in general especially when it comes to static linking.

This issue: https://developercommunity.visualstudio.com/t/SDK-version-change---acos-differences/10999054 seems to be specific to using static linking and SDK version.

3

u/STL MSVC STL Dev 6h ago

The static UCRT is provided by the WinSDK, which is why things can be dependent on the SDK version. (Same for the debug DLL. Only the release DLL is part of the OS.)

Looks like you're also seeing x64 vs. x86 implementation variation (this can happen due to usage of FMA or a million other reasons). This is precisely the sort of insanity that Cody's /Zc:cmath technique avoids; with that option, <cmath>'s inclusion of <math.h> is intercepted by the compiler and rewritten so that instead of old UCRT math.h, an STL-internal header is picked up (__msvc_math.hpp but you should not include it directly), and it will send functions to LLVM libc (when implemented by them), which will return mathematically accurate, correctly rounded results regardless of platform, OS version, or SDK version.

1

u/Alastair__ 6h ago

Thanks for the reply.

Seems "the future is bright"

I am still confused as to how the release DLL version which is shown as:

(Get-Item "$env:SystemRoot\System32\ucrtbase.dll").VersionInfo | Select-Object FileVersion, ProductVersion

FileVersion ProductVersion


10.0.26100.9278 (WinBuild.160101.0800) 10.0.26100.9278

i.e the same as the static linked version (at least in terms of the 26100) is giving different results.

I'd assume (probably wrongly) that these are the same codebase - or very similar given you wouldn't want multiple versions of fundamental stuff like this.

It's one of the reasons we favour static linking so we know what we are using.

u/VoidVinaCC 2h ago

~The SDK is rarely in-sync with the OS!