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.36725 / 14.52.36725.
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
- Brought the
C4815andC4816warnings (zero-sized arrays and by-value parameters that are copied) to the C compiler. - Improved diagnostics for preprocessor constant expressions, including better reporting of malformed and nested conditions.
- Improved the source text shown in several diagnostics so the reported expression better matches what you wrote.
- Fixed rejection of valid constexpr
void*variables. - Unified the behavior of type traits when their preconditions are not satisfied.
- Added validation of the symbols entered into function parameter scopes, catching malformed declarations earlier.
- Fixed a compiler crash when computing the size of a dependent type in some Qt code patterns.
- Fixed an internal compiler error triggered by a name lookup on an imported using-declaration that names an overload set.
- Fixed an internal compiler error involving constraint failures in tuple-like structured bindings.
- Fixed a missing access check when taking the address of a static member.
- Fixed overload resolution failures (
C2672) when passing certain reference wrappers. - Fixed a rare race condition in
cl.exewhen releasing intermediate buffers. - Fixed a spurious
C4739warning reported against compiler-generated temporaries.
C++ Modules
- Fixed argument-dependent lookup of an unresolved template-id across a module boundary.
- Fixed instantiation of a defaulted function when the instantiation crosses module units.
- Preserved macro whitespace when building and consuming header units, so stringized macros round-trip correctly.
- Improved handling of types first defined in the global module fragment.
Code Generation and Optimization
ARM64 improvements:
- Added support for the FEAT_CSSC common short sequence compression instructions.
- Added intrinsics for FEAT_FAMINMAX (floating-point absolute minimum/maximum).
- Implemented the FEAT_LUT LUTI4 lookup-table instructions, and added bf16 support for the LUTI2 and LUTI4 intrinsics.
- Recognized
copysignas an inline intrinsic. - Hoisted loop-invariant SVE all-true predicates out of loop bodies.
- Modeled condition flags for SVE compares and the
MATCH/NMATCHandWHILEinstruction families, enabling more flag reuse. - Fused a NEON-to-SVE bridge of an undefined vector into a single instruction, and improved register allocation preferences for bridge moves.
- Added support for
__preserve_noneand[[msvc::musttail]]. - Improved extraction of a 32-bit float from the upper half of a two-element vector.
- Added more NEON by-element multiply patterns and better indirect-addressing support in the instruction selector.
- Fixed ARM64X coroutine tail calls when Control Flow Guard is enabled.
- Fixed an internal compiler error when emitting debug information for an unused constant parameter.
- Fixed lowering of guest-reference imports for ARM64EC under LTCG.
x64 and x86 improvements:
- Broad APX improvements: additional NDD (new data destination) instruction patterns and tuning for memory operand forms, conversion of NDD
INC/DECandSUBsequences into shorterLEAforms, extended shift, compare, and conditional-move optimizations, APX awareness in the constant-propagation lattice, and APX-aware loop unrolling and strength-reduction cost models. - Added conditional-compare (
CFCMOV) optimizations. - Preferred the shorter
LEAencoding overADDwhere it is profitable. - Added AVX2 and AVX-512
memchrimplementations and updated thememcpyselection for AMD processors. - Removed a redundant register copy before broadcasting a scalar double to a vector.
- Fixed selection of horizontal add for 128-bit 32-bit-float reductions.
- Improved the accuracy of shift-result range tracking by modeling the hardware shift-count mask.
- Improved combining of adjacent vector stores for two-element double vectors.
- Fixed vector register zeroing after block initialization sequences.
- Fixed AVX-512 upper-register usage to follow the enclosing function’s architecture rather than the module’s.
- Fixed non-deterministic code generation for floating-point and vector zero constants.
- Removed the deprecated AMX
TMMULTF32PSinstruction. - Added fixed-register constraints for
RDPRU. - Stopped re-aligning EVEX-encoded instructions in a way that could change encodings.
- Improved code size when compiling with
/O1and/Osby running additional pre-allocation optimizations and adjusting instruction costs for size.
Optimizer improvements:
- Enabled a new aliased copy-propagation pass, which also recognizes
memsetandmemcpyand hoists loop-invariant aliased loads. - Improved the pre-vectorizer’s loop unswitching to handle nested loops, unblocking vectorization in more cases.
- Recognized sub-accumulate reduction patterns in the vectorizer.
- Improved vectorization of phi nodes in the superword-level parallelism pass.
- Improved inlining heuristics: penalized inlining cold code into hot code.
- Extended min/max canonicalization through single-use address copies.
- Folded mixed-signedness compare-branch diamonds into a single compare.
- Enabled common-subexpression elimination for vector element extraction.
- Enabled tail-call optimization for indirect calls to
noexceptfunctions. - Restored elision of static constant arrays.
- Improved conditional-expression optimization when the compared value comes from a phi, and allowed more conditional-expression forms on x64.
- Added an overflow check to predicate reasoning, and avoided merging conditional expressions whose comparisons differ in signedness.
- Extended copy propagation with extended-basic-block analysis.
- Improved compile time by avoiding repeated exception-handling region scans and by bounding dead-use searches that could hang x86 LTCG links.
- Fixed a shrink-wrapping bug where register restores were chained to the wrong block.
- Fixed a stack overflow caused by unbounded recursion while processing structured exception handling.
- Fixed an internal compiler error involving non-COMDAT segments.
- Fixed a use-after-free and a use-before-def in the SSA optimizer.
- Fixed scalar replacement of aggregates for certain multi-byte types.
- Prevented cross-module Just My Code marker collisions under LTCG.
- Preserved loop-invariant dominance in the loop unroller, and fixed range inference for mutable symbols.
- Fixed an incorrect simplification of unsigned shift-right of a multiplication.
Debug Information
- Continued work to support debug-information streams up to 4 GB, including a refactoring of the underlying buffer layer and a new public stream API.
- Added debug-record support for alternate object names, so tools can report the originating object file more accurately.
- Fixed the mapping from declarations to definitions in emitted debug information.
- Reported debug thread-pool startup failures as a diagnostic instead of terminating.
- Reduced allocations in type-record processing, improving throughput on large programs.
- Fixed a DIA stack overflow on cyclic type-index references when reading corrupt PDBs.
- Fixed cross-PDB type-index cache contamination in the PDB server (mspdbsrv.exe).
- Fixed object counting while reading a library in the object reader.
- Added a switch to emit type aliases into debug records for improved debugging.
- Rejected an unsupported DIA write-back API parameter value.
- Retired writing of the obsolete minimal/fastlink PDB format.
Linker and Assembler
- Named the metadata item responsible for
LNK2022andLNK4227, making mismatched metadata far easier to diagnose. - Improved error reporting from the assembler.
- Disabled early-exit epilog sharing for the newer unwind format, correcting unwind behavior.
- Fixed a crash when incrementally relinking a resource-only DLL.
- Fixed incremental relink tracking of weak external symbols.
- Fixed an access violation while emitting symbols for a discarded duplicate COMDAT.
- Fixed a null-dereference (previously reported as
LNK1000) when linking a COMDAT section with no symbols; it now produces the diagnosticLNK1143. - Fixed a
link.exe /dumpcrash on a malformed debug directory, and adumpilk /symbolscrash on valid incremental-link files. - Fixed an access violation in
dumpbin /UNWINDINFOon an out-of-range register value. - Hardened parsing of malformed object files, libraries, and C++ module metadata across the linker and its dump tools.
Static Analysis
- Replaced several ad-hoc groupings of analysis warnings with a tag-based system, making rule sets easier to author.
- Added names and descriptions to code-analysis warnings so SARIF viewers can display them.
- Fixed ATL and MFC headers to build cleanly under stricter conformance settings, including replacing
throw()withnoexceptinatlcom.hand removing an ill-formed cast. - Removed an invalid
typenamebefore an unqualified template-id in the concurrency headers.
AddressSanitizer
- Fixed an ARM64 correctness issue involving page writes and instruction handling.
- Improved runtime performance by removing duplicated quarantine work.
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:
- [C] C structs containing only a flexible array member can have size not a multiple of alignment
- [ML.exe] Assembly Errors (AMX instructions)
- [NEG][Regression] No compiler error for lambdas with undefined const ref/pointer parameter types
- [Regression] C++ compiler rejects some character in identifiers under /std:c++latest that are allowed in the draft standard
- [Regression] Compiler error message misspells “statement” as “statment”
- [Regression] ICE with MSVC Insiders Preview 19.52.36530
- [Regression] Internal Compiler Error (C1001) in MSVC v14.51 ARM64 compiling ARM SVE intrinsics (arm_sve.h)
- [Regression] Internal Compiler Error with ARM SVE: svdupq_n_* + Pointer to vector with /RTCs
- [Regression] MSVC /d1initall1023 triggers C3321 in <shared_mutex>
- [Regression] MSVC 19.51 /O2 regression increases C++20 coroutine frame sizes ~18x under /O2
- [Regression] MSVC compiler ICE regression building QtWebEngine with Google Highway code
- [Regression] MSVC linker incremental linking hits LNK1000 in IMAGE::EmitRelocations
- [Regression] MSVC Release optimizer reorders position of if block and skips reachable code with cout
- [Regression] MSVC x64 /O2 folds memcpy of constant int array into wrong memset
- [Regression] throw from destructor inside catch block raises bogus C4530
- [Regression][std:c++17] MSVC doesn’t drop cv-qualification from the result of operator const T() conversion function when T is a scalar type
- [Regression][std:c++17] SFINAE probe of a member call instantiates same-named enclosing-namespace function template; unbounded memory use (C1060) in 19.51
- [Regression][std:c++20] Regression in 19.52.36615: C4864 (“expected ‘template’ keyword before dependent template name”) now over-fires
- [Regression][std:c++20] C++20 nested template lambda deduces lambda’s type as int regression
- [Regression][std:c++20] Compiler emits warning C4864 for alias template member access in a namespace
- [Regression][std:c++20] MSVC miscompiles signed
(x << k) > 0asx > 0 - [Regression][std:c++latest] C++ compiler emits erroneous C2675/C2676/C2677 for
requiresclause in generic lambda inside template - [Regression][std:c++latest] Visual C++ empty fold expression on + accepts invalid code or ICEs C1001
- [Regression][std:c++latest] MSVC nested lambda pack expansion emits C2440 when capturing this
- [Regression] Template parameter unrecognized in noexcept expression inside template specialization inside class
- [Regression] MSVC /O1 miscompiles nested array loop, regression from 19.50
- [std:c++20] C++/CLI with /clr rejects C++20
using enumwith error C2868 - [std:c++20] C++20 modules MSVC error C2440 when default member initializer uses lambda capturing
this - [std:c++20] C7602: unsatisfied constraint escapes a requires-expression in a class template with a parameter pack
- [std:c++20] Can’t initialize constinit or constexpr references from another variable
- [std:c++20] Compiler warning C5264 ignores [[maybe_unused]] on const variables
- [std:c++20] Invalid code generation when using
deducing thisin a lambda - [std:c++20] MSVC: __pragma(loop(no_vector)) and _Pragma(“loop(no_vector)”) inside lambdas cause compilation error under /std:c++20 and /std:c++latest
- [std:c++20][Regression] C1001: Internal compiler error. Using std::mutex and /std:c++20
- [std:c++20][Regression] Regression MSVC 19.51 updated lambda processor (/Zc:lambda) triggers C2086 redefinition
- [std:c++23preview] MSVC rejects range-for over C++23 auto cast
- [std:c++latest] MSVC C2039/C2504 when importing a module that includes full standalone Asio with io_context::service
- [std:c++latest] Bogus warning C5202
- [std:c++latest] MSVC explicit-object conversion operator misses implicit move, C2664
- [std:c++latest] MSVC modules: exported template calling exec::start_detached fails with C2064
- [std:c++latest] MSVC rejects local struct NTTP on a lambda nested in another immediately-invoked template lambda
- /Brepro causes build errors when VS Code (its file watcher) is watching for file changes in the output directory
- ARM codegen overallocates switch-case locals, causing kernel stack overflow
- ARM64 /O2: wrong load instruction (ldrh instead of ldrsh) when reloading int8_t from stack
- armasm64 drops symbol offset in adrp/add/ldr
- armasm64 ldr fails to reference later declared symbols
- ATL/MFC uses invalid nullptr reinterpret_cast (14.52 preview)
- bbopt direct CFG/bbopt exits with unhandled exception 0xC0000005 access violation
- C++ Modules: C1001 ICE when overloading constrained special member function
- C1001: Internal Compiler Error – Access Violation Linker
- Capture of constexpr variable not working inside template lambda
- CHPE VCCRT __longjmp_internal prototype mismatch triggers LNK4279 with /d2hybrid
- Coverage Sanitizer inserts many instrumentation in the middle of basic blocks
- Coverage sanitizer instrumentation breaks after optimization passes
- Incorrect offset for .savereg when using unwind V3 with frame pointer + non-zero offset
- Leaf functions that return an object with a non-empty destructor allocates stack space
- Link LTCG with /d2hybrid emits bad LoadLibraryExW export thunk dereference
- Miscompilation of AArch64 SVE loop (Version 19.50.35722 for ARM64)
- MSVC /Ox Optimizer Incorrectly Handles Control Flow with goto Statements in Nested try-catch Blocks with Exception Re-throwing
- MSVC backend C1001 compiling captured coroutine lambda with
this auto - MSVC code gen error when compiling with optimizations enabled
- MSVC fails to emit LD1R for DUP of scalar (ARM64)
- MSVC produces suboptimal code for NEON-SVE Bridge intrinsics [Version 19.51.36223.2 for ARM64 (PREVIEW)]
- Poor AVX2 codegen for simple double load and broadcasts..
- Preprocessor falsely reports missing ‘)’ for nested macro conditions
- Problems with msvc preprocessing macro implementation (__has_builtin)
- SPGO SPDConvert fails with inconsistent block count
- std::swap of arrays of trivial type is not getting vectorized
- There is a problem with MSVC optimizing the immintrin instruction
- vcbit: When I run a tool, it reports an error.
- Vulcan dump.exe /dumpNearJumpsCSV fails with BB0113 on wof.sys
- Windows MSVC 32-bit v19 compiler bug: round and convert double to unsigned long long
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.