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;