The MSVC Build Tools Preview is updated regularly with the latest features and fixes from the MSVC development team. This post covers the last month’s updates of the Preview build tools, currently targeting the v14.53 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 Visual Studio 2026 Insiders Channel , Insiders gets MSVC Preview updates more frequently.
To check if it’s installed simply make sure one or both of these components are checked in the installer:
- MSVC Build Tools for x64/x86 (Preview)
- MSVC Build Tools for ARM64/ARM64EC (Preview)
Follow the instructions on https://aka.ms/msvc/preview to configure your IDE & command prompts to use the MSVC Build Tools Preview.
The version number printed by cl.exe and link.exe will be at least 19.53.36930 / 14.53.36930.
We appreciate any feedback that you may have. Please report any issues on Visual Studio Developer Community so we can address them by the time we move out of preview.
C++ Conformance and Frontend
- Added support for
[[fallthrough]]in C++14 mode. - Added C++ warnings C4878 and C4879 for additional explicit and implicit conversions between
HRESULTorSCODEand Boolean-like types. Both warnings are level 4 and off by default. Ticket - Added
/Zc:__super[-]and/Zc:__if_exists[-]to control the__superand__if_existsMicrosoft extensions. - Reduced frontend memory usage by improving allocation and lifetime management for buffered source tokens.
- Added
-fsanitize-coverage-ignorelistas an alternative spelling for-fsanitize-coverage-blocklist, preserving compatibility with existing command lines. Ticket
Code Generation and Optimization
ARM64 improvements:
- Extended experimental support for the Arm Scalable Matrix Extension under
/feature:sme, including streaming-function declarations, supported direct and indirect calls, link-time code generation, exception handling, and runtime state-management helpers. Support is native ARM64 only and remains partial; streaming-function definitions and ARM64EC are not supported. - Added the
ARM64_FPMRconstant for_ReadStatusRegand_WriteStatusReg, along with theFPMRregister name in the ARM64 assembler and disassembler. Executing these instructions requires hardware and operating-system support. - Improved inlining decisions on ARM64 and ARM64EC by accounting for floating-point and vector-register pressure, helping avoid unnecessary spills.
- Replaced some multi-step NEON zero-extension sequences with a table-lookup instruction.
x64 and x86 improvements:
- Expanded APX conditional-compare generation, including comparisons produced when lowering switch statements, and improved conditional-move instruction selection.
- Re-enabled compact x64 epilog generation for unwind version 3.
- Improved AVX-512 instruction selection by combining supported arithmetic-and-blend sequences into merge-masked arithmetic instructions.
- Replaced eligible late-stage constant multiplications on x64 with shorter address-calculation instructions.
Optimizer improvements:
- Added opt-in automatic load-time function selection for link-time code generation. The
[[msvc::auto_dispatch]]attribute can generate CPU-specific implementations from one function body for selection by a supporting loader. - Improved inlining decisions to expose more opportunities for simplifying aggregate objects and eliminating unused stores.
- Improved constant-remainder optimization on x86 and ARM64, replacing eligible hardware divisions with multiply-and-shift sequences.
- Removed redundant comparisons and unreachable branches inside loops when their outcomes follow from the loop bounds.
- Expanded vectorization opportunities by recognizing more non-overlapping memory accesses and more ways to pack scalar values into vectors.
- Added partial support for vectorizing groups of three elements.
- Improved loop-unswitching decisions so more loops can be simplified before vectorization, including eligible conditions read through pointers.
- Reduced padding in generated runtime type information and exception-handling data, helping reduce 64-bit executable and DLL sizes.
Linker and Assembler
- Added the opt-in linker option
/WARNUNUSEDLIBS. It emits LNK4324 for each input library from which no members were loaded. The warning supports/IGNORE:4324and warning-as-error settings without changing/VERBOSE:UNUSEDLIBS. Ticket - Improved incremental-link performance for projects with large numbers of input files by reducing repeated filename searches.
- Expanded the set of valid epilog instructions accepted by MASM with unwind version 3, including
VERWandSWAPGS.
Static Analysis
- Expanded C26433 and C26435 checking to virtual destructor overrides, aligning the checks with the current C++ Core Guidelines. Ticket
AddressSanitizer
- Added the opt-in
windows_shadow_top_downoption on 64-bit Windows. SettingASAN_OPTIONS=windows_shadow_top_down=1before AddressSanitizer initializes places shadow memory in the highest available address range that fits, rather than the lowest. This can reduce managed-runtime memory overhead when loading an instrumented DLL into an application using the .NET Framework garbage collector. The option is off by default, has no effect on 32-bit Windows, and must be set through the environment early enough to affect initialization;__asan_default_optionsis too late to change shadow placement.
Standard Library
See the STL changelog for details on standard library improvements in the MSVC Build Tools Preview.
Tickets Fixed
The following tickets reported through Developer Community have been fixed in this update:
- _Pragma in header unit causes ICE with preview platform toolset 19.52.36725
- /EHa compiler 19.52preview optimizes away local variable accessed from catch block
- /Zc:checkGwOdr fails to detect ODR violations when used with /GL
- &Derived::f as an argument of an auto non-type template parameter gets a malformed type when f comes from a using-declaration
- [[msvc::dispatch]]: nested all() inside any() is flattened
- <ranges> plus import std triggers C2382
- 14.52: C1001 “Internal Compiler Error” on ARM64 when compiling /GL + /LTCG
- 17.14 Regression ICE in modules with using base::operator=
- Adding a zero vector incorrectly preserves negative zero
- Address-taken functions are missing from Control Flow Guard metadata
- ADL fails to consider the namespace associated with the base class under a specific scenario
- Apps built with /QSpectre-load and /CETCOMPAT crashes with EXCEPTION_STACK_OVERFLOW
- Arm NEON codegen miscompiles two constant broadcast arguments under /O2
- ARM64 /GL + /LTCG: wrong vector-move code in cmsofflineservicing.dll (MSVC 19.52)
- ARM64 /O2 /Gs0: prologue calls __chkstk before spilling lr, destroying the return address
- ARM64 backend miscompiles NEON logical ops with narrow splat constants
- ARM64 could use SMADDL for two-dimensional array element addresses
- ARM64 linker crashes with C1001 and LNK1000
- ARM64 linker reports C1001 while converting a static library
- ARM64EC retail builds fail with LNK1000
- C compiler rejects C99 const and static array parameter qualifiers
- C compiler: wrong code generation: mulsd is not generated
- C++ compiler crashes with access violation compiling AsyncGenerator coroutine
- C++ compiler rejects friend template member-pointer parameter as incompatible
- C++ Dynamic Debugging: .alt switch triggers 0xC0000005 with /DYNAMICBASE:NO
- C++ modules reject first imported specialization with requires pack fold
- C++ modules trigger C1116 while importing compiled module information
- C++ modules: Import with explicit template instantiation fails with compile error
- C++ std::invocable rejects nested generic lambda with nontrivial return type
- C++/CLI struct/class doesn’t use MarshalCopy
- C1001 internal compiler error in C++ code
- C1001 internal compiler error when compiling C++ modules
- C1001 internal compiler error when targeting ARM64EC
- C1001 when a return type passes a reference parameter pack to a consteval function
- C2079 when importing <sstream> as a header unit alongside two modules
- C2678 for decltype(a * b * c) with a deducing-this conversion in scope
- C4737 “Unable to perform required tail call” on coroutine symmetric transfer under /arch:AVX2
- C4865 does not print the current underlying type
- compiler does not emit implicit return 0 from main after catch with empty loop construct
- Compiler fails to emit C4874 unless the target type defines an assignment operator overload
- Consecutive packed absolute-value intrinsics are incorrectly removed
- constexpr function returning consteval ctor fails with MSVC C7595
- Copy elision erroneously applied to base class construction
- CTAD with designated initializer doesn’t compile
- CWG2813: extra move in calling of explicit object member function
- CWG3129 Error on overflow in floating-point literal instead of infinity
- Debugger showing incorrect types in incrementally linked PDBs
- Default switch case being optimized away in debug
- Enclave C runtime 19.52preview breaks on Server2022 because IsProcessorFeaturePresent.
- Error message suggests experimental “/await” instead of conforming “/await:strict” if coroutines are used in C++17 without command line arg
- HPmdGen emits BB1013, BB1027, and BB0108 for valid x86 binary/PDB pairs
- Hpmdgen fails to write an image and PDB with unwind version 3
- Hpmdgen rejects valid unwind version 3 epilogs
- Inability to simply write coroutine that throws an exception (compiler reports different warnings on every optimization level)
- Incorrect coroutine codegen when resuming std::noop_coroutine with /Gz
- Incorrect signed-zero results from optimized vector compare-and-blend operations
- Incorrectly permissive requires-statement re: negated concepts in C++20
- InterlockedBitTestAndSet16 is missing.
- internal compiler error arm64 tds_c_events.cpp(6444) 19.52preview
- Internal compiler error on valid C++ source
- Internal compiler error when compiling ARM64 vector code
- Internal compiler error when using struct containing string followed by union around anonymous structs
- Internal compiler error with C++ modules
- LINK /ONFAILREPRO omits an input library from failure capture
- link.exe LINK_REPRO enters infinite CreateFileW retry over MAX_PATH
- Linker crashes when combining sanitizer coverage and profile-guided optimization
- Linker crashes with C1001 on x64 and ARM64
- Linker fails with C1001 converting an ARM64X static library
- Linker fails with LNK2055 misaligned import tables and LNK1000
- LNK1000 error when linking with PGO
- LTCG link stalls at Generating code
- LTCG misorders a failing assertion before a function call on x64 and ARM64
- Masked stores lose data under /O1 and /O2
- MaXDep fails while processing a DLL
- Miscompile: constant evaluator aliases two distinct string literals used in constexpr initializers
- Modules ICE when using constraint on friend function of explicitly instantiated struct template
- MSVC /O1 and /O2 miscompiles signed modulo comparison expression
- MSVC /O2 /arch:AVX2 emits incorrect store for highway Reverse on one-lane int32_t
- MSVC /O2 miscompiles global assignment followed by XOR operation
- MSVC /O2 miscompiles short-to-unsigned widening and reuses wrong sign extension
- MSVC /O2 miscompiles signed-char division after reversible byte transform
- MSVC 14.52 link fails with C1001 when using /GL, /LTCG and /SPGO enabled
- MSVC 14.52 LTCG reports C4744 for incomplete extern when completed struct contains anonymous union
- MSVC 14.52 regression: C2079 in std::getline with C++20 modules
- MSVC 19.52 miscompiles ffmpeg for arm64 (h264pred, h264qpel, qpeldsp, intrax8dsp, vp9dsp_8bpp)
- MSVC accepts taking address of rvalue reference in unevaluated context with /permissive-
- MSVC auto-vectorizer(for AVX-512) mixes SSE/VEX/EVEX without vzeroupper, causing slowdown (~280x)
- MSVC AVX2 codegen emits vblendps mask 16 instead of 8 for _mm_blend_ps
- MSVC Build Tools Preview omits vcvars batch files unless Latest is installed
- MSVC C compiler types unary ! as _Bool instead of int in C11/C17
- MSVC C++ modules omit inline variable export, causing LNK2001
- MSVC C++ modules trigger C2752 for partial specialization across modules
- MSVC C++ overload resolution reports C2668 for concept shorthand
- MSVC C++ parser silently accepts range-for statement as function body
- MSVC C++20 resolves decltype(func<int>) to non-template overload
- MSVC C1001 compiling constexpr reference as non-type template parameter
- MSVC C2751 rejects dependent qualified alias packs in lambda parameters
- MSVC C5264 falsely flags used static constexpr local in function template
- MSVC compiler hits C1001 with [[msvc::no_unique_address]] non-trivial member
- MSVC emits C2280 for parenthesized conditional prvalue copy elision
- MSVC emits C2718 for over-aligned argument with C-style variadic overload
- MSVC emits spurious C2397 for member-pointer comparison in base initializer
- MSVC fails to cold-path _MSVC_STL_HARDENING bounds checks, hurting performance
- MSVC falsely emits C2039 on unordered_set::size in a template containing a lambda and range-for loop
- MSVC incorrectly accepts using built-in operator& on rvalues in C++20 concepts
- MSVC incorrectly emits C4499 for static const template class member specializations
- MSVC incorrectly rejects conversion function returning decltype containing generic lambda
- MSVC loop optimizer drops while(cur != nullptr) check, causing 0xC0000005
- MSVC modules emit C2871 for using-directive in global-fragment template
- MSVC optimizer ICE C1001 compiling loop with pointer arithmetic in C
- MSVC optimizer miscompiles under /O2
- MSVC optimizer miscompiles unsigned long long arithmetic under /O2 vs /Od
- MSVC rejects some uses trailing return type in member function templates
- MSVC rejects stdexec::sync_wait with C2672 in __variant::__visit
- MSVC rejects valid concepts using explicitly deleted functions with C1903
- MSVC should bump __cpp_constexpr to 202211L in C++23 and later modes
- MSVC skips aggregate initializer for empty [[msvc::no_unique_address]] member
- MSVC x64 optimizer miscompiles __forceinline decode under /O2 /Ob1
- MSVC x86 LTCG drops conditional malloc size term, causing 0xC0000374
- Numerical error in ARM Neon vqrshrnh_n_u16 intrinsic
- OpenMP with /GL passes an invalid thread identifier to an orphaned parallel loop (Error #132)
- Potential ABI break between MSVC 14.51 and 14.52 Preview causing Boost.Serialization runtime failure
- std::is_constructible_v fails to compile with private destructor in C++20
- Suboptimal ARM64 code generation for value clipping
- Suboptimal code generation for dynamic bit extraction
- Suboptimal code generation for narrow integer multiplication
- Template member function definitions in a different module partition fail to be emitted
- The “C2039: ‘nullopt’: is not a member of ‘std'” error when compiling as a C++20 module
- Using the spaceship operator produces worse code
- Vectorizer crashes when compiling APX-enabled code
- Visual C++ __vectorcall __m128i member access triggers C1001 ICE
- Visual Studio gets stuck while inlining
- x64 /O2 bad codegen: integer add emitted as addsd/vaddsd in unrolled loop with single-member struct
- x64 optimizer incorrectly removes unsigned short bit-15 test under /O2
- x64, optimized, synchronous exception model: a coroutine whose final_suspend() returns suspend_never skips the destructors of its locals and leaks
- x86 /O2 codegen emits CRC32 with incorrect destination operand
- x86 32-bit release builds corrupting SSE vector variable
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.