From 6939357e299a5eaf872b5ad885e0c08f4ad400ca Mon Sep 17 00:00:00 2001
From: "Stephan T. Lavavej" <stl@microsoft.com>
Date: Tue, 11 Jun 2024 13:13:46 -0700
Subject: [PATCH 1/8] Python 3.12.4.

---
 azure-devops/provision-image.ps1 | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/azure-devops/provision-image.ps1 b/azure-devops/provision-image.ps1
index 4fb69a968f..826fa4bfea 100644
--- a/azure-devops/provision-image.ps1
+++ b/azure-devops/provision-image.ps1
@@ -43,7 +43,7 @@ foreach ($workload in $VisualStudioWorkloads) {
 $PowerShellUrl = 'https://github.com/PowerShell/PowerShell/releases/download/v7.4.2/PowerShell-7.4.2-win-x64.msi'
 $PowerShellArgs = @('/quiet', '/norestart')
 
-$PythonUrl = 'https://www.python.org/ftp/python/3.12.3/python-3.12.3-amd64.exe'
+$PythonUrl = 'https://www.python.org/ftp/python/3.12.4/python-3.12.4-amd64.exe'
 $PythonArgs = @('/quiet', 'InstallAllUsers=1', 'PrependPath=1', 'CompileAll=1', 'Include_doc=0')
 
 $CudaUrl = 'https://developer.download.nvidia.com/compute/cuda/12.4.0/local_installers/cuda_12.4.0_551.61_windows.exe'

From fa8cd574658d12ef67d7eaecbdf0dcc0e36e012f Mon Sep 17 00:00:00 2001
From: "Stephan T. Lavavej" <stl@microsoft.com>
Date: Tue, 11 Jun 2024 13:53:31 -0700
Subject: [PATCH 2/8] New pool.

---
 azure-devops/config.yml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/azure-devops/config.yml b/azure-devops/config.yml
index 9ecd9a9132..43ac66c605 100644
--- a/azure-devops/config.yml
+++ b/azure-devops/config.yml
@@ -5,7 +5,7 @@
 
 variables:
 - name: poolName
-  value: 'StlBuild-2024-05-21T1719-Pool'
+  value: 'StlBuild-2024-06-11T1315-Pool'
   readonly: true
 - name: poolDemands
   value: 'EnableSpotVM -equals false'

From 4609029dc7e851bca7a5416593411b5de5412472 Mon Sep 17 00:00:00 2001
From: "Stephan T. Lavavej" <stl@microsoft.com>
Date: Tue, 11 Jun 2024 13:55:26 -0700
Subject: [PATCH 3/8] VS 2022 17.11 Preview 2.

---
 README.md | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/README.md b/README.md
index 499f7aa195..92a1d1062b 100644
--- a/README.md
+++ b/README.md
@@ -141,7 +141,7 @@ Just try to follow these rules, so we can spend more time fixing bugs and implem
 
 # How To Build With The Visual Studio IDE
 
-1. Install Visual Studio 2022 17.11 Preview 1 or later.
+1. Install Visual Studio 2022 17.11 Preview 2 or later.
     * Select "Windows 11 SDK (10.0.22621.0)" in the VS Installer.
     * We recommend selecting "C++ CMake tools for Windows" in the VS Installer.
     This will ensure that you're using supported versions of CMake and Ninja.
@@ -156,7 +156,7 @@ Just try to follow these rules, so we can spend more time fixing bugs and implem
 
 # How To Build With A Native Tools Command Prompt
 
-1. Install Visual Studio 2022 17.11 Preview 1 or later.
+1. Install Visual Studio 2022 17.11 Preview 2 or later.
     * Select "Windows 11 SDK (10.0.22621.0)" in the VS Installer.
     * We recommend selecting "C++ CMake tools for Windows" in the VS Installer.
     This will ensure that you're using supported versions of CMake and Ninja.

From 99b068feaf0c46078f172e8ce3b0543fd9782933 Mon Sep 17 00:00:00 2001
From: "Stephan T. Lavavej" <stl@nuwen.net>
Date: Tue, 11 Jun 2024 14:07:23 -0700
Subject: [PATCH 4/8] Remove workarounds for VSO-1913897 DevCom-10508937
 "Startup issue when building the static debug STL with ASan enabled".

---
 tests/libcxx/lit.site.cfg.in        |  3 +--
 tests/libcxx/usual_matrix.lst       |  2 +-
 tests/std/include/force_include.hpp |  2 --
 tests/std/include/vso1913897.hpp    | 15 ---------------
 4 files changed, 2 insertions(+), 20 deletions(-)
 delete mode 100644 tests/std/include/vso1913897.hpp

diff --git a/tests/libcxx/lit.site.cfg.in b/tests/libcxx/lit.site.cfg.in
index 9c38ff305d..7d850be335 100644
--- a/tests/libcxx/lit.site.cfg.in
+++ b/tests/libcxx/lit.site.cfg.in
@@ -25,8 +25,7 @@ lit_config.library_dirs     = getattr(lit_config, 'library_dirs', dict())
 lit_config.test_subdirs     = getattr(lit_config, 'test_subdirs', dict())
 
 lit_config.expected_results[config.name] = stl.test.file_parsing.parse_result_file('@LIBCXX_EXPECTED_RESULTS@')
-# TRANSITION, VSO-1913897: '@STL_SOURCE_DIR@/tests/std/include' is a workaround
-lit_config.include_dirs[config.name]     = ['@STL_TESTED_HEADERS_DIR@', '@LIBCXX_SOURCE_DIR@/test/support', '@STL_SOURCE_DIR@/tests/std/include']
+lit_config.include_dirs[config.name]     = ['@STL_TESTED_HEADERS_DIR@', '@LIBCXX_SOURCE_DIR@/test/support']
 lit_config.library_dirs[config.name]     = ['@STL_LIBRARY_OUTPUT_DIRECTORY@', '@TOOLSET_LIB@']
 lit_config.test_subdirs[config.name]     = ['@LIBCXX_SOURCE_DIR@/test/std']
 
diff --git a/tests/libcxx/usual_matrix.lst b/tests/libcxx/usual_matrix.lst
index 55b3f40056..a6642320f3 100644
--- a/tests/libcxx/usual_matrix.lst
+++ b/tests/libcxx/usual_matrix.lst
@@ -3,7 +3,7 @@
 
 RUNALL_INCLUDE ..\universal_prefix.lst
 RUNALL_CROSSLIST
-*	PM_CL="/EHsc /MTd /std:c++latest /permissive- /utf-8 /FImsvc_stdlib_force_include.h /FIvso1913897.hpp /wd4643 /D_STL_CALL_ABORT_INSTEAD_OF_INVALID_PARAMETER"
+*	PM_CL="/EHsc /MTd /std:c++latest /permissive- /utf-8 /FImsvc_stdlib_force_include.h /wd4643 /D_STL_CALL_ABORT_INSTEAD_OF_INVALID_PARAMETER"
 RUNALL_CROSSLIST
 PM_CL="/analyze:autolog- /Zc:preprocessor /wd6262"
 ASAN	PM_CL="-fsanitize=address /Zi" PM_LINK="/debug"
diff --git a/tests/std/include/force_include.hpp b/tests/std/include/force_include.hpp
index 074919b481..e4cf52a9f6 100644
--- a/tests/std/include/force_include.hpp
+++ b/tests/std/include/force_include.hpp
@@ -14,8 +14,6 @@
 #include <stdio.h>
 #include <stdlib.h>
 
-#include "vso1913897.hpp"
-
 struct TestEnvironmentPreparer {
     TestEnvironmentPreparer() noexcept {
         // avoid assertion dialog boxes; see GH-781
diff --git a/tests/std/include/vso1913897.hpp b/tests/std/include/vso1913897.hpp
deleted file mode 100644
index e849ead7ea..0000000000
--- a/tests/std/include/vso1913897.hpp
+++ /dev/null
@@ -1,15 +0,0 @@
-// Copyright (c) Microsoft Corporation.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-
-#pragma once
-
-#ifndef _M_CEE
-
-// TRANSITION, dynamically initialize a thread_local to workaround VSO-1913897
-inline int __stl_asan_init_function() {
-    static volatile int __stl_asan_init_volatile = 42;
-    return __stl_asan_init_volatile;
-}
-static thread_local int __stl_asan_init_variable = __stl_asan_init_function();
-
-#endif // _M_CEE

From bc1e58f48af18277785bd0f67ca3bcf3d50459d3 Mon Sep 17 00:00:00 2001
From: "Stephan T. Lavavej" <stl@nuwen.net>
Date: Tue, 11 Jun 2024 14:08:53 -0700
Subject: [PATCH 5/8] Remove workaround for VSO-1985428 "<limits.h> emits
 warning C4668".

---
 stl/inc/climits | 3 ---
 1 file changed, 3 deletions(-)

diff --git a/stl/inc/climits b/stl/inc/climits
index 097693232f..20b85bdf25 100644
--- a/stl/inc/climits
+++ b/stl/inc/climits
@@ -8,10 +8,7 @@
 #include <yvals_core.h>
 #if _STL_COMPILER_PREPROCESSOR
 
-#pragma warning(push) // TRANSITION, VSO-1985428
-#pragma warning(disable : 4668) // 'MEOW' is not defined as a preprocessor macro, replacing with '0' for '#if/#elif'
 #include <limits.h>
-#pragma warning(pop)
 
 #endif // _STL_COMPILER_PREPROCESSOR
 #endif // _CLIMITS_

From b1ada024198b7c1def5e6814b8b024f47fd43e92 Mon Sep 17 00:00:00 2001
From: "Stephan T. Lavavej" <stl@nuwen.net>
Date: Tue, 11 Jun 2024 14:14:04 -0700
Subject: [PATCH 6/8] Remove workarounds for VSO-2016422 "EDG hasn't
 (completely?) implemented CWG-2518 making static_assert(false) usable".

---
 stl/inc/format                                 |  4 ++--
 stl/inc/functional                             | 18 ++++++++----------
 stl/inc/numbers                                |  4 ++--
 stl/inc/ranges                                 |  2 +-
 stl/inc/type_traits                            |  9 +++------
 stl/inc/utility                                |  2 +-
 stl/inc/xlocale                                |  2 +-
 tests/std/include/range_algorithm_support.hpp  |  3 ---
 .../P0896R4_ranges_iterator_machinery/test.cpp |  2 +-
 .../test.compile.pass.cpp                      |  2 +-
 tests/std/tests/P0898R3_concepts/test.cpp      |  5 +----
 11 files changed, 21 insertions(+), 32 deletions(-)

diff --git a/stl/inc/format b/stl/inc/format
index bf50772212..91e0d7d48f 100644
--- a/stl/inc/format
+++ b/stl/inc/format
@@ -2464,8 +2464,8 @@ _EXPORT_STD enum class range_format { disabled, map, set, sequence, string, debu
 
 template <class _Ty>
 struct _Invalid_format_kind {
-    static_assert(_Always_false<_Ty>, "A program that instantiates the primary template of format_kind is ill-formed. "
-                                      "(N4964 [format.range.fmtkind]/1)");
+    static_assert(false, "A program that instantiates the primary template of format_kind is ill-formed. "
+                         "(N4964 [format.range.fmtkind]/1)");
 };
 
 _EXPORT_STD template <class _Ty>
diff --git a/stl/inc/functional b/stl/inc/functional
index 5150939b5d..57da0c98d6 100644
--- a/stl/inc/functional
+++ b/stl/inc/functional
@@ -1047,7 +1047,7 @@ private:
 
 template <class _Tx>
 struct _Get_function_impl {
-    static_assert(_Always_false<_Tx>, "std::function only accepts function types as template arguments.");
+    static_assert(false, "std::function only accepts function types as template arguments.");
 };
 
 #define _GET_FUNCTION_IMPL(CALL_OPT, X1, X2, X3)                                                  \
@@ -1060,11 +1060,10 @@ _NON_MEMBER_CALL(_GET_FUNCTION_IMPL, X1, X2, X3)
 #undef _GET_FUNCTION_IMPL
 
 #ifdef __cpp_noexcept_function_type
-#define _GET_FUNCTION_IMPL_NOEXCEPT(CALL_OPT, X1, X2, X3)                                                         \
-    template <class _Ret, class... _Types>                                                                        \
-    struct _Get_function_impl<_Ret CALL_OPT(_Types...) noexcept> {                                                \
-        static_assert(                                                                                            \
-            _Always_false<_Ret>, "std::function does not accept noexcept function types as template arguments."); \
+#define _GET_FUNCTION_IMPL_NOEXCEPT(CALL_OPT, X1, X2, X3)                                                     \
+    template <class _Ret, class... _Types>                                                                    \
+    struct _Get_function_impl<_Ret CALL_OPT(_Types...) noexcept> {                                            \
+        static_assert(false, "std::function does not accept noexcept function types as template arguments."); \
     };
 _NON_MEMBER_CALL(_GET_FUNCTION_IMPL_NOEXCEPT, X1, X2, X3)
 #undef _GET_FUNCTION_IMPL_NOEXCEPT
@@ -1621,10 +1620,9 @@ public:
 
 template <class... _Signature>
 class _Move_only_function_call {
-    static_assert(_Always_false<integral_constant<size_t, sizeof...(_Signature)>>,
-        "std::move_only_function only accepts function types as template arguments, "
-        "with possibly const/ref/noexcept qualifiers. Also, unlike std::function, "
-        "std::move_only_function does not define class template argument deduction guides.");
+    static_assert(false, "std::move_only_function only accepts function types as template arguments, "
+                         "with possibly const/ref/noexcept qualifiers. Also, unlike std::function, "
+                         "std::move_only_function does not define class template argument deduction guides.");
 };
 
 // A script to generate the specializations is at
diff --git a/stl/inc/numbers b/stl/inc/numbers
index e82ab5f8a7..6da4feb361 100644
--- a/stl/inc/numbers
+++ b/stl/inc/numbers
@@ -23,8 +23,8 @@ _STD_BEGIN
 namespace numbers {
     template <class _Ty>
     struct _Invalid {
-        static_assert(_Always_false<_Ty>, "A program that instantiates a primary template of a mathematical constant "
-                                          "variable template is ill-formed. (N4950 [math.constants]/3)");
+        static_assert(false, "A program that instantiates a primary template of a mathematical constant "
+                             "variable template is ill-formed. (N4950 [math.constants]/3)");
     };
 
     _EXPORT_STD template <class _Ty>
diff --git a/stl/inc/ranges b/stl/inc/ranges
index d93eb0bfc8..e1d695c078 100644
--- a/stl/inc/ranges
+++ b/stl/inc/ranges
@@ -203,7 +203,7 @@ namespace ranges {
 
     template <range _Rng, class _Derived>
     class _Cached_position : public view_interface<_Derived> {
-        static_assert(_Always_false<_Rng>, "A range must be at least forward for position caching to be worthwhile.");
+        static_assert(false, "A range must be at least forward for position caching to be worthwhile.");
     };
 
     template <forward_range _Rng, class _Derived>
diff --git a/stl/inc/type_traits b/stl/inc/type_traits
index a38a56b9d6..21e6d25d36 100644
--- a/stl/inc/type_traits
+++ b/stl/inc/type_traits
@@ -27,9 +27,6 @@ _STL_DISABLE_CLANG_WARNINGS
 #undef known_semantics
 
 _STD_BEGIN
-template <class>
-constexpr bool _Always_false = false; // TRANSITION, VSO-2016422 (EDG)
-
 template <bool _First_value, class _First, class... _Rest>
 struct _Conjunction { // handle false trait or last trait
     using type = _First;
@@ -1150,7 +1147,7 @@ struct _Aligned<_Len, _Align, double, false> {
     };
 #else // ^^^ defined(_ENABLE_EXTENDED_ALIGNED_STORAGE) / !defined(_ENABLE_EXTENDED_ALIGNED_STORAGE) vvv
 #ifndef _DISABLE_EXTENDED_ALIGNED_STORAGE
-    static_assert(_Always_false<_Aligned>,
+    static_assert(false,
         "You've instantiated std::aligned_storage<Len, Align> with an extended alignment (in other "
         "words, Align > alignof(max_align_t)). Before VS 2017 15.8, the member \"type\" would "
         "non-conformingly have an alignment of only alignof(max_align_t). VS 2017 15.8 was fixed to "
@@ -1832,8 +1829,8 @@ using _Select_invoke_traits = conditional_t<sizeof...(_Args) == 0, _Invoke_trait
 #if _HAS_DEPRECATED_RESULT_OF
 _EXPORT_STD template <class _Fty>
 struct _CXX17_DEPRECATE_RESULT_OF result_of { // explain usage
-    static_assert(_Always_false<_Fty>, "result_of<CallableType> is invalid; use "
-                                       "result_of<CallableType(zero or more argument types)> instead.");
+    static_assert(false, "result_of<CallableType> is invalid; use "
+                         "result_of<CallableType(zero or more argument types)> instead.");
 };
 
 #define _RESULT_OF(CALL_OPT, X1, X2, X3)                                                                    \
diff --git a/stl/inc/utility b/stl/inc/utility
index d5e58acc00..5c796a1423 100644
--- a/stl/inc/utility
+++ b/stl/inc/utility
@@ -634,7 +634,7 @@ struct tuple_size<tuple<_Types...>> : integral_constant<size_t, sizeof...(_Types
 
 template <size_t _Index>
 struct _MSVC_KNOWN_SEMANTICS tuple_element<_Index, tuple<>> { // enforce bounds checking
-    static_assert(_Always_false<integral_constant<size_t, _Index>>, "tuple index out of bounds");
+    static_assert(false, "tuple index out of bounds");
 };
 
 template <class _This, class... _Rest>
diff --git a/stl/inc/xlocale b/stl/inc/xlocale
index f1f84c8bc7..d287df9a5d 100644
--- a/stl/inc/xlocale
+++ b/stl/inc/xlocale
@@ -2449,7 +2449,7 @@ _EXPORT_STD extern "C++" template <class _Elem>
 class ctype : public ctype_base { // facet for classifying elements, converting cases
 public:
     // ctype<char>, ctype<wchar_t>, and ctype<unsigned short> are explicitly specialized below.
-    static_assert(!_ENFORCE_FACET_SPECIALIZATIONS || _Always_false<_Elem>, _FACET_SPECIALIZATION_MESSAGE);
+    static_assert(!_ENFORCE_FACET_SPECIALIZATIONS, _FACET_SPECIALIZATION_MESSAGE);
 
     using char_type = _Elem;
 
diff --git a/tests/std/include/range_algorithm_support.hpp b/tests/std/include/range_algorithm_support.hpp
index b68513e3d4..b71b654f06 100644
--- a/tests/std/include/range_algorithm_support.hpp
+++ b/tests/std/include/range_algorithm_support.hpp
@@ -16,9 +16,6 @@
 
 namespace ranges = std::ranges;
 
-template <class>
-constexpr bool always_false = false; // TRANSITION, VSO-2016422 (EDG)
-
 template <class T>
 constexpr T* nullptr_to = nullptr;
 
diff --git a/tests/std/tests/P0896R4_ranges_iterator_machinery/test.cpp b/tests/std/tests/P0896R4_ranges_iterator_machinery/test.cpp
index 919d5e26c9..9814bc4feb 100644
--- a/tests/std/tests/P0896R4_ranges_iterator_machinery/test.cpp
+++ b/tests/std/tests/P0896R4_ranges_iterator_machinery/test.cpp
@@ -1716,7 +1716,7 @@ namespace std_iterator_tags_test {
 namespace incomplete_test {
     template <class T>
     struct do_not_instantiate {
-        static_assert(always_false<T>);
+        static_assert(false);
     };
 
     using E = do_not_instantiate<void>;
diff --git a/tests/std/tests/P0896R4_ranges_subrange/test.compile.pass.cpp b/tests/std/tests/P0896R4_ranges_subrange/test.compile.pass.cpp
index c436ca1718..cf6054aff5 100644
--- a/tests/std/tests/P0896R4_ranges_subrange/test.compile.pass.cpp
+++ b/tests/std/tests/P0896R4_ranges_subrange/test.compile.pass.cpp
@@ -995,7 +995,7 @@ namespace test_subrange {
 
     template <class T>
     struct illformed {
-        static_assert(always_false<T>);
+        static_assert(false);
     };
 
     template <class T>
diff --git a/tests/std/tests/P0898R3_concepts/test.cpp b/tests/std/tests/P0898R3_concepts/test.cpp
index 3a1ca18a6c..22b6dd0cdd 100644
--- a/tests/std/tests/P0898R3_concepts/test.cpp
+++ b/tests/std/tests/P0898R3_concepts/test.cpp
@@ -29,15 +29,12 @@ constexpr bool is_trait = false;
 template <class T>
 constexpr bool is_trait<T, std::void_t<typename T::type>> = true;
 
-template <class>
-constexpr bool always_false = false; // TRANSITION, VSO-2016422 (EDG)
-
 struct IncompleteClass;
 union IncompleteUnion;
 
 template <class T>
 struct DoNotInstantiate {
-    static_assert(always_false<T>);
+    static_assert(false);
 };
 
 struct Immobile {

From cfbca890aeaaff5c5857d3259b7ce96d7077eed0 Mon Sep 17 00:00:00 2001
From: "Stephan T. Lavavej" <stl@nuwen.net>
Date: Tue, 11 Jun 2024 14:15:48 -0700
Subject: [PATCH 7/8] Remove workarounds for VSO-2064546 "EDG ICE when deriving
 from std::num_get".

---
 tests/std/tests/GH_001277_num_get_bad_grouping/test.cpp | 4 ----
 tests/std/tests/LWG2381_num_get_floating_point/test.cpp | 4 ----
 tests/tr1/tests/locale3/test.cpp                        | 4 ----
 tests/tr1/tests/locale4/test.cpp                        | 4 ----
 4 files changed, 16 deletions(-)

diff --git a/tests/std/tests/GH_001277_num_get_bad_grouping/test.cpp b/tests/std/tests/GH_001277_num_get_bad_grouping/test.cpp
index d03fe2ab32..8d5e72294e 100644
--- a/tests/std/tests/GH_001277_num_get_bad_grouping/test.cpp
+++ b/tests/std/tests/GH_001277_num_get_bad_grouping/test.cpp
@@ -1,8 +1,6 @@
 // Copyright (c) Microsoft Corporation.
 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
 
-#ifndef __EDG__ // TRANSITION, VSO-2064546
-
 #include <cassert>
 #include <cstddef>
 #include <cstdint>
@@ -461,5 +459,3 @@ int main() {
     test_nonending_unlimited_grouping<double>();
     test_nonending_unlimited_grouping<long double>();
 }
-
-#endif // ^^^ no workaround ^^^
diff --git a/tests/std/tests/LWG2381_num_get_floating_point/test.cpp b/tests/std/tests/LWG2381_num_get_floating_point/test.cpp
index 44c50f7243..7f0615f97e 100644
--- a/tests/std/tests/LWG2381_num_get_floating_point/test.cpp
+++ b/tests/std/tests/LWG2381_num_get_floating_point/test.cpp
@@ -13,8 +13,6 @@
 // * std/localization/locale.categories/category.numeric/locale.num.get/facet.num.get.members/get_float.pass.cpp
 // * std/localization/locale.categories/category.numeric/locale.num.get/facet.num.get.members/get_double.pass.cpp
 
-#ifndef __EDG__ // TRANSITION, VSO-2064546
-
 #include <cassert>
 #include <cmath>
 #include <cstddef>
@@ -618,5 +616,3 @@ int main() {
     test_double_from_char_cases<long double>();
 #endif // _HAS_CXX17
 }
-
-#endif // ^^^ no workaround ^^^
diff --git a/tests/tr1/tests/locale3/test.cpp b/tests/tr1/tests/locale3/test.cpp
index 89136f897a..2c177311fe 100644
--- a/tests/tr1/tests/locale3/test.cpp
+++ b/tests/tr1/tests/locale3/test.cpp
@@ -1,8 +1,6 @@
 // Copyright (c) Microsoft Corporation.
 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
 
-#ifndef __EDG__ // TRANSITION, VSO-2064546
-
 // test <locale>, part 3
 #define TEST_NAME "<locale>, part 3"
 
@@ -555,5 +553,3 @@ void test_main() { // test basic workings of locale definitions
     test_time_get();
     test_time_put();
 }
-
-#endif // ^^^ no workaround ^^^
diff --git a/tests/tr1/tests/locale4/test.cpp b/tests/tr1/tests/locale4/test.cpp
index 16cafe7d49..8ed6bcb057 100644
--- a/tests/tr1/tests/locale4/test.cpp
+++ b/tests/tr1/tests/locale4/test.cpp
@@ -1,8 +1,6 @@
 // Copyright (c) Microsoft Corporation.
 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
 
-#ifndef __EDG__ // TRANSITION, VSO-2064546
-
 // test <locale>, part 4
 #define TEST_NAME "<locale>, part 4"
 
@@ -523,5 +521,3 @@ void test_main() { // test basic workings of locale definitions
     test_time_get();
     test_time_put();
 }
-
-#endif // ^^^ no workaround ^^^

From 8880a7d736393a47b1bd4afcc6ccf1da033afa0f Mon Sep 17 00:00:00 2001
From: "Stephan T. Lavavej" <stl@nuwen.net>
Date: Wed, 12 Jun 2024 05:06:38 -0700
Subject: [PATCH 8/8] Restore `_Always_false` in product code for CUDA 12.4.

---
 stl/inc/format      |  4 ++--
 stl/inc/functional  | 18 ++++++++++--------
 stl/inc/numbers     |  4 ++--
 stl/inc/ranges      |  2 +-
 stl/inc/type_traits |  9 ++++++---
 stl/inc/utility     |  2 +-
 stl/inc/xlocale     |  2 +-
 7 files changed, 23 insertions(+), 18 deletions(-)

diff --git a/stl/inc/format b/stl/inc/format
index 91e0d7d48f..bf50772212 100644
--- a/stl/inc/format
+++ b/stl/inc/format
@@ -2464,8 +2464,8 @@ _EXPORT_STD enum class range_format { disabled, map, set, sequence, string, debu
 
 template <class _Ty>
 struct _Invalid_format_kind {
-    static_assert(false, "A program that instantiates the primary template of format_kind is ill-formed. "
-                         "(N4964 [format.range.fmtkind]/1)");
+    static_assert(_Always_false<_Ty>, "A program that instantiates the primary template of format_kind is ill-formed. "
+                                      "(N4964 [format.range.fmtkind]/1)");
 };
 
 _EXPORT_STD template <class _Ty>
diff --git a/stl/inc/functional b/stl/inc/functional
index 57da0c98d6..5150939b5d 100644
--- a/stl/inc/functional
+++ b/stl/inc/functional
@@ -1047,7 +1047,7 @@ private:
 
 template <class _Tx>
 struct _Get_function_impl {
-    static_assert(false, "std::function only accepts function types as template arguments.");
+    static_assert(_Always_false<_Tx>, "std::function only accepts function types as template arguments.");
 };
 
 #define _GET_FUNCTION_IMPL(CALL_OPT, X1, X2, X3)                                                  \
@@ -1060,10 +1060,11 @@ _NON_MEMBER_CALL(_GET_FUNCTION_IMPL, X1, X2, X3)
 #undef _GET_FUNCTION_IMPL
 
 #ifdef __cpp_noexcept_function_type
-#define _GET_FUNCTION_IMPL_NOEXCEPT(CALL_OPT, X1, X2, X3)                                                     \
-    template <class _Ret, class... _Types>                                                                    \
-    struct _Get_function_impl<_Ret CALL_OPT(_Types...) noexcept> {                                            \
-        static_assert(false, "std::function does not accept noexcept function types as template arguments."); \
+#define _GET_FUNCTION_IMPL_NOEXCEPT(CALL_OPT, X1, X2, X3)                                                         \
+    template <class _Ret, class... _Types>                                                                        \
+    struct _Get_function_impl<_Ret CALL_OPT(_Types...) noexcept> {                                                \
+        static_assert(                                                                                            \
+            _Always_false<_Ret>, "std::function does not accept noexcept function types as template arguments."); \
     };
 _NON_MEMBER_CALL(_GET_FUNCTION_IMPL_NOEXCEPT, X1, X2, X3)
 #undef _GET_FUNCTION_IMPL_NOEXCEPT
@@ -1620,9 +1621,10 @@ public:
 
 template <class... _Signature>
 class _Move_only_function_call {
-    static_assert(false, "std::move_only_function only accepts function types as template arguments, "
-                         "with possibly const/ref/noexcept qualifiers. Also, unlike std::function, "
-                         "std::move_only_function does not define class template argument deduction guides.");
+    static_assert(_Always_false<integral_constant<size_t, sizeof...(_Signature)>>,
+        "std::move_only_function only accepts function types as template arguments, "
+        "with possibly const/ref/noexcept qualifiers. Also, unlike std::function, "
+        "std::move_only_function does not define class template argument deduction guides.");
 };
 
 // A script to generate the specializations is at
diff --git a/stl/inc/numbers b/stl/inc/numbers
index 6da4feb361..e82ab5f8a7 100644
--- a/stl/inc/numbers
+++ b/stl/inc/numbers
@@ -23,8 +23,8 @@ _STD_BEGIN
 namespace numbers {
     template <class _Ty>
     struct _Invalid {
-        static_assert(false, "A program that instantiates a primary template of a mathematical constant "
-                             "variable template is ill-formed. (N4950 [math.constants]/3)");
+        static_assert(_Always_false<_Ty>, "A program that instantiates a primary template of a mathematical constant "
+                                          "variable template is ill-formed. (N4950 [math.constants]/3)");
     };
 
     _EXPORT_STD template <class _Ty>
diff --git a/stl/inc/ranges b/stl/inc/ranges
index e1d695c078..d93eb0bfc8 100644
--- a/stl/inc/ranges
+++ b/stl/inc/ranges
@@ -203,7 +203,7 @@ namespace ranges {
 
     template <range _Rng, class _Derived>
     class _Cached_position : public view_interface<_Derived> {
-        static_assert(false, "A range must be at least forward for position caching to be worthwhile.");
+        static_assert(_Always_false<_Rng>, "A range must be at least forward for position caching to be worthwhile.");
     };
 
     template <forward_range _Rng, class _Derived>
diff --git a/stl/inc/type_traits b/stl/inc/type_traits
index 21e6d25d36..48f056d3c2 100644
--- a/stl/inc/type_traits
+++ b/stl/inc/type_traits
@@ -27,6 +27,9 @@ _STL_DISABLE_CLANG_WARNINGS
 #undef known_semantics
 
 _STD_BEGIN
+template <class>
+constexpr bool _Always_false = false; // TRANSITION, needed by CUDA 12.4 in classes; see CWG-2518, VSO-2016422 (EDG)
+
 template <bool _First_value, class _First, class... _Rest>
 struct _Conjunction { // handle false trait or last trait
     using type = _First;
@@ -1147,7 +1150,7 @@ struct _Aligned<_Len, _Align, double, false> {
     };
 #else // ^^^ defined(_ENABLE_EXTENDED_ALIGNED_STORAGE) / !defined(_ENABLE_EXTENDED_ALIGNED_STORAGE) vvv
 #ifndef _DISABLE_EXTENDED_ALIGNED_STORAGE
-    static_assert(false,
+    static_assert(_Always_false<_Aligned>,
         "You've instantiated std::aligned_storage<Len, Align> with an extended alignment (in other "
         "words, Align > alignof(max_align_t)). Before VS 2017 15.8, the member \"type\" would "
         "non-conformingly have an alignment of only alignof(max_align_t). VS 2017 15.8 was fixed to "
@@ -1829,8 +1832,8 @@ using _Select_invoke_traits = conditional_t<sizeof...(_Args) == 0, _Invoke_trait
 #if _HAS_DEPRECATED_RESULT_OF
 _EXPORT_STD template <class _Fty>
 struct _CXX17_DEPRECATE_RESULT_OF result_of { // explain usage
-    static_assert(false, "result_of<CallableType> is invalid; use "
-                         "result_of<CallableType(zero or more argument types)> instead.");
+    static_assert(_Always_false<_Fty>, "result_of<CallableType> is invalid; use "
+                                       "result_of<CallableType(zero or more argument types)> instead.");
 };
 
 #define _RESULT_OF(CALL_OPT, X1, X2, X3)                                                                    \
diff --git a/stl/inc/utility b/stl/inc/utility
index 5c796a1423..d5e58acc00 100644
--- a/stl/inc/utility
+++ b/stl/inc/utility
@@ -634,7 +634,7 @@ struct tuple_size<tuple<_Types...>> : integral_constant<size_t, sizeof...(_Types
 
 template <size_t _Index>
 struct _MSVC_KNOWN_SEMANTICS tuple_element<_Index, tuple<>> { // enforce bounds checking
-    static_assert(false, "tuple index out of bounds");
+    static_assert(_Always_false<integral_constant<size_t, _Index>>, "tuple index out of bounds");
 };
 
 template <class _This, class... _Rest>
diff --git a/stl/inc/xlocale b/stl/inc/xlocale
index d287df9a5d..f1f84c8bc7 100644
--- a/stl/inc/xlocale
+++ b/stl/inc/xlocale
@@ -2449,7 +2449,7 @@ _EXPORT_STD extern "C++" template <class _Elem>
 class ctype : public ctype_base { // facet for classifying elements, converting cases
 public:
     // ctype<char>, ctype<wchar_t>, and ctype<unsigned short> are explicitly specialized below.
-    static_assert(!_ENFORCE_FACET_SPECIALIZATIONS, _FACET_SPECIALIZATION_MESSAGE);
+    static_assert(!_ENFORCE_FACET_SPECIALIZATIONS || _Always_false<_Elem>, _FACET_SPECIALIZATION_MESSAGE);
 
     using char_type = _Elem;