The MSVC Build Tools Preview is updated regularly with the latest features and fixes from the MSVC development team. This post covers updates from the past month, currently targeting the v14.52 release. This encompasses changes across the compiler frontend, backend, linker, standard library, and related tools.
Although you can acquire the MSVC Build Tools Preview through either the Visual Studio 2026 Stable Channel or Insiders Channel, Insiders gets MSVC Preview updates more quickly (roughly weekly).
To check whether it is installed, make sure one or both of these components are selected in the Visual Studio Installer:
- MSVC Build Tools for x64/x86 (Preview)
- MSVC Build Tools for ARM64/ARM64EC (Preview)
Follow the instructions at https://aka.ms/msvc/preview to configure your IDE and command prompts to use the MSVC Build Tools Preview.
The version number printed by cl.exe and link.exe will be at least 19.52.36615 / 14.52.36615.
We appreciate your feedback. Please report issues through Visual Studio Developer Community so we can address them before the toolset moves out of preview.
C++ Conformance and Frontend
- Added support for default-initialized
new[]expressions in constant evaluation when used with modules. - Improved diagnostics for calling-convention mismatches, incompatible compiler options, and unusable compiled-library files.
- Improved handling of argument-dependent lookup involving names that are not exported from a module.
- Improved parser robustness during nested template and module instantiation.
- Improved consistency when writing class data-member information to modules.
- Added missing math intrinsics and improved math-header handling with modules, advancing compile-time support.
C++ Modules
- Improved type merging when header units are shared across multiple modules.
- Improved module serialization of data members and template information.
- Fixed incremental processing of shared module data when invoked more than once.
- Improved handling of compile-time array allocation in module code.
Code Generation and Optimization
ARM64 improvements:
- Added support for Armv9.2 LUTI2 lookup-table instructions and corresponding intrinsics.
- Recognized common vector permutation and per-lane rotation patterns, replacing longer instruction sequences with more efficient operations.
- Improved generation of vector loads followed by lane insertion.
- Improved preservation of adjacent load pairs during register allocation.
- Improved tracking of used vector lanes through scalar floating-point operations, allowing more redundant instructions to be removed.
- Improved immediate forms for vector bit-clear operations.
- Prevented unsafe pairing of store-with-writeback instructions when an operand shares the base register.
x64 and x86 improvements:
- Expanded instruction selection for APX operations, including additional destination forms and removal of redundant zero-extension operations.
- Improved conditional-compare generation with APX.
- Improved generation of all-bits-set vector constants.
- Improved tail-call handling for functions with paired register operations.
- Added a recursion limit to prevent excessive processing during partial-register optimization.
Optimizer improvements:
- Improved jump-to-jump optimizations and allowed more opportunities when local scope information is present.
- Improved scalar-promotion induction-variable recognition.
- Improved optimization of equality-test loops with loop-carried dependencies.
- Preserved more useful predicates during optimization.
- Improved optimization around restricted pointers and function calls.
- Improved simplification of overflow intrinsics while preserving signedness.
- Enabled inline expansion of
fmin,fmax, andcopysignon additional targets.
Debug Information
- Continued work to support larger debug-information streams, including groundwork for streams up to 4 GB.
- Added a way for debugger clients to release debug-database file handles without immediately discarding loaded data, allowing the file to be rebuilt sooner.
- Improved diagnostics produced by debug-information inspection tools.
- Improved type merging for programs that use header units and modules.
Linker and Assembler
- Correctly quoted paths passed through the linker’s
/EDIToption when output paths contain spaces. - Added support for the
int1instruction to the assembler and disassembly tools. - Improved handling of large function prologs and epilogs in x64 exception data.
- Fixed an assembler crash caused by an invalid section identifier.
- Improved unwinding support for newer epilog formats.
Static Analysis
- Expanded code-analysis coverage across more components of the toolset.
- Fixed uninitialized-variable warnings in ATL and MFC sources.
- Reduced noisy
C5246diagnostics involving constant evaluation.
AddressSanitizer
- Use MSDIS (MSVC disassembler) as a fallback instruction-length decoder for interception, reducing “unrecognized instruction” failures. This is on by default and can be disabled via
ASAN_OPTIONS=windows_use_msdis_decoder=false. To trace what instructions were intercepted by MSDIS instead of the manual instruction decoder, setverbosity=3and search for logs prefixed with “MSDIS instruction decoder:”. - Added a diagnostic for incompatible use of AddressSanitizer with
/clr.
Standard Library
- See https://github.com/microsoft/STL/wiki/Changelog for details on STL improvements in the MSVC Build Tools Preview.
Tickets Fixed
The following tickets reported through Developer Community have been fixed in this update:
- Nested templated lambda fails to find local lambda variable in decltype
- C++ lambda triggers C2872 ambiguous symbol error with using directives
- C1001 on a range-for over
std::initializer_listin a lambda - Internal compiler error when a struct is implicitly converted to
bool /std:c++23previewtriggers internal compiler error C1001- C++20 requires pack expansion triggers C7602 in alias-template chaining
- Incorrect code generation for a virtual function call with a virtual base class and
__declspec(empty_bases) - Profile-instrumented runtime crash on ARM64
- Missed optimization opportunity from value-range equivalence
- MASM rejects
.setframeonr15 - Potential incorrect code generation during Empty Base Optimization
- Improve module build output when a compiled library is corrupt
- APX and return-thunk protection trigger LNK1379
alignasrejects pack expansion in a constant-evaluated function call- Unexpected C2888 when a templated lambda is used as a non-type template argument
- Passing a derived lambda class as the explicit
thisparameter corrupts the program - ARM64 link-time compilation fails with C1001 and LNK1257
- AVX2 intrinsic inlining corrupts output in release builds
- Hotpatch build blockers
- C2382 for a template member with dependent
noexcept std::ellint_2produces the wrong result near two pi- Incorrect overload resolution for reference-to-array member access through a prvalue object
- Valid non-type template argument bound to
F::fis rejected - Pointer-to-data-member initialization incorrectly requires a dynamic initializer
- C2352 on a member function call in a templated
noexceptcontext - AVX-512 instruction emitted when targeting AVX2
- Valid inherited-constructor program is rejected
- Constrained constructor is not inherited through a using-declaration
- Pack expansion is expected too early in a lambda fold expression
/wd4100template instantiation triggers an internal compiler error- C++ Modules with Boost.Beast and OpenSSL trigger C1001
- Linker crashes while searching libraries for Arm64EC binaries
- ARM64 hotpatch metadata generation fails on direct references
- Explicit-object member function template with an invalid return type triggers an internal compiler error
- x64 optimization corrupts constant-initialized GUID members
- Incorrect
decltype(auto)deduction from anautotemplate parameter - Arm64EC link-time compilation emits mismatched push thunks
- Constrained friend templates are incorrectly diagnosed as duplicate definitions
- ARM64 optimization does not preserve positive and negative zero
- gRPC compilation fails with C3539
autotemplate parameter does not undergo array decay in a default template argument
Try Out the MSVC Build Tools Preview!
Please try out the MSVC Build Tools Preview and let us know what you think! Installation instructions:
- Download Visual Studio 2026 Insiders for frequent updates, or download Visual Studio 2026 for less frequent updates.
- Install the Desktop development with C++ workload and make sure one or both of these MSVC components are checked (depending on your target build architecture):
- MSVC Build Tools for x64/x86 (Preview)
- MSVC Build Tools for ARM64/ARM64EC (Preview)
- Follow the instructions on https://aka.ms/msvc/preview on configuring your IDE & command prompts to use the MSVC Build Tools Preview.
- Share your feedback with us on Visual Studio Developer Community.
0 comments
Be the first to start the discussion.