diff --git a/libcxx/include/numbers b/libcxx/include/numbers --- a/libcxx/include/numbers +++ b/libcxx/include/numbers @@ -73,42 +73,42 @@ namespace numbers { -template +template inline constexpr bool __false = false; -template +template struct __illformed { - static_assert(__false, "A program that instantiates a primary template of a mathematical constant variable template is ill-formed."); + static_assert(__false<_Tp>, "A program that instantiates a primary template of a mathematical constant variable template is ill-formed."); }; -template inline constexpr T e_v = __illformed{}; -template inline constexpr T log2e_v = __illformed{}; -template inline constexpr T log10e_v = __illformed{}; -template inline constexpr T pi_v = __illformed{}; -template inline constexpr T inv_pi_v = __illformed{}; -template inline constexpr T inv_sqrtpi_v = __illformed{}; -template inline constexpr T ln2_v = __illformed{}; -template inline constexpr T ln10_v = __illformed{}; -template inline constexpr T sqrt2_v = __illformed{}; -template inline constexpr T sqrt3_v = __illformed{}; -template inline constexpr T inv_sqrt3_v = __illformed{}; -template inline constexpr T egamma_v = __illformed{}; -template inline constexpr T phi_v = __illformed{}; - -template inline constexpr T e_v = 2.718281828459045235360287471352662; -template inline constexpr T log2e_v = 1.442695040888963407359924681001892; -template inline constexpr T log10e_v = 0.434294481903251827651128918916605; -template inline constexpr T pi_v = 3.141592653589793238462643383279502; -template inline constexpr T inv_pi_v = 0.318309886183790671537767526745028; -template inline constexpr T inv_sqrtpi_v = 0.564189583547756286948079451560772; -template inline constexpr T ln2_v = 0.693147180559945309417232121458176; -template inline constexpr T ln10_v = 2.302585092994045684017991454684364; -template inline constexpr T sqrt2_v = 1.414213562373095048801688724209698; -template inline constexpr T sqrt3_v = 1.732050807568877293527446341505872; -template inline constexpr T inv_sqrt3_v = 0.577350269189625764509148780501957; -template inline constexpr T egamma_v = 0.577215664901532860606512090082402; -template inline constexpr T phi_v = 1.618033988749894848204586834365638; +template inline constexpr _Tp e_v = __illformed<_Tp>{}; +template inline constexpr _Tp log2e_v = __illformed<_Tp>{}; +template inline constexpr _Tp log10e_v = __illformed<_Tp>{}; +template inline constexpr _Tp pi_v = __illformed<_Tp>{}; +template inline constexpr _Tp inv_pi_v = __illformed<_Tp>{}; +template inline constexpr _Tp inv_sqrtpi_v = __illformed<_Tp>{}; +template inline constexpr _Tp ln2_v = __illformed<_Tp>{}; +template inline constexpr _Tp ln10_v = __illformed<_Tp>{}; +template inline constexpr _Tp sqrt2_v = __illformed<_Tp>{}; +template inline constexpr _Tp sqrt3_v = __illformed<_Tp>{}; +template inline constexpr _Tp inv_sqrt3_v = __illformed<_Tp>{}; +template inline constexpr _Tp egamma_v = __illformed<_Tp>{}; +template inline constexpr _Tp phi_v = __illformed<_Tp>{}; + +template inline constexpr _Tp e_v<_Tp> = 2.718281828459045235360287471352662; +template inline constexpr _Tp log2e_v<_Tp> = 1.442695040888963407359924681001892; +template inline constexpr _Tp log10e_v<_Tp> = 0.434294481903251827651128918916605; +template inline constexpr _Tp pi_v<_Tp> = 3.141592653589793238462643383279502; +template inline constexpr _Tp inv_pi_v<_Tp> = 0.318309886183790671537767526745028; +template inline constexpr _Tp inv_sqrtpi_v<_Tp> = 0.564189583547756286948079451560772; +template inline constexpr _Tp ln2_v<_Tp> = 0.693147180559945309417232121458176; +template inline constexpr _Tp ln10_v<_Tp> = 2.302585092994045684017991454684364; +template inline constexpr _Tp sqrt2_v<_Tp> = 1.414213562373095048801688724209698; +template inline constexpr _Tp sqrt3_v<_Tp> = 1.732050807568877293527446341505872; +template inline constexpr _Tp inv_sqrt3_v<_Tp> = 0.577350269189625764509148780501957; +template inline constexpr _Tp egamma_v<_Tp> = 0.577215664901532860606512090082402; +template inline constexpr _Tp phi_v<_Tp> = 1.618033988749894848204586834365638; inline constexpr double e = e_v; inline constexpr double log2e = log2e_v; diff --git a/libcxx/include/optional b/libcxx/include/optional --- a/libcxx/include/optional +++ b/libcxx/include/optional @@ -1167,8 +1167,8 @@ }; #if _LIBCPP_STD_VER >= 17 -template - optional(T) -> optional; +template + optional(_Tp) -> optional<_Tp>; #endif // Comparisons between optionals diff --git a/libcxx/include/type_traits b/libcxx/include/type_traits --- a/libcxx/include/type_traits +++ b/libcxx/include/type_traits @@ -2318,7 +2318,7 @@ // Clang provides variadic templates in C++03 as an extension. #if !defined(_LIBCPP_CXX03_LANG) || defined(__clang__) # define _LIBCPP_OPTIONAL_PACK(...) , __VA_ARGS__ -template +template struct __common_types; template struct _LIBCPP_TEMPLATE_VIS common_type; diff --git a/libcxx/test/configs/apple-libc++-shared.cfg.in b/libcxx/test/configs/apple-libc++-shared.cfg.in --- a/libcxx/test/configs/apple-libc++-shared.cfg.in +++ b/libcxx/test/configs/apple-libc++-shared.cfg.in @@ -13,7 +13,7 @@ '-isysroot {}'.format('@CMAKE_OSX_SYSROOT@') if '@CMAKE_OSX_SYSROOT@' else '' )) config.substitutions.append(('%{compile_flags}', - '-nostdinc++ -isystem %{install}/include/c++/v1 -I %{libcxx}/test/support -include %{libcxx}/test/support/nasty_macros.h' + '-nostdinc++ -isystem %{install}/include/c++/v1 -I %{libcxx}/test/support' )) config.substitutions.append(('%{link_flags}', '-nostdlib++ -L %{install}/lib -lc++' diff --git a/libcxx/test/configs/ibm-libc++-shared.cfg.in b/libcxx/test/configs/ibm-libc++-shared.cfg.in --- a/libcxx/test/configs/ibm-libc++-shared.cfg.in +++ b/libcxx/test/configs/ibm-libc++-shared.cfg.in @@ -6,7 +6,7 @@ config.substitutions.append(('%{flags}', '')) config.substitutions.append(('%{compile_flags}', - '-nostdinc++ -D__LIBC_NO_CPP_MATH_OVERLOADS__ -isystem %{install}/include/c++/v1 -I %{libcxx}/test/support -include %{libcxx}/test/support/nasty_macros.h' + '-nostdinc++ -D__LIBC_NO_CPP_MATH_OVERLOADS__ -isystem %{install}/include/c++/v1 -I %{libcxx}/test/support' )) config.substitutions.append(('%{link_flags}', '-nostdlib++ -L %{install}/lib -lc++ -lc++abi -latomic -Wl,-bbigtoc' diff --git a/libcxx/test/configs/llvm-libc++-shared-gcc.cfg.in b/libcxx/test/configs/llvm-libc++-shared-gcc.cfg.in --- a/libcxx/test/configs/llvm-libc++-shared-gcc.cfg.in +++ b/libcxx/test/configs/llvm-libc++-shared-gcc.cfg.in @@ -6,7 +6,7 @@ config.substitutions.append(('%{flags}', '')) config.substitutions.append(('%{compile_flags}', - '-nostdinc++ -isystem %{include} -isystem %{target-include} -I %{libcxx}/test/support -include %{libcxx}/test/support/nasty_macros.h' + '-nostdinc++ -isystem %{include} -isystem %{target-include} -I %{libcxx}/test/support' )) config.substitutions.append(('%{link_flags}', '-L %{lib} -Wl,-rpath,%{lib} -nodefaultlibs -lc++ -lm -lgcc_s -lgcc -lpthread -lc -lgcc_s -lgcc -latomic' diff --git a/libcxx/test/configs/llvm-libc++-shared.cfg.in b/libcxx/test/configs/llvm-libc++-shared.cfg.in --- a/libcxx/test/configs/llvm-libc++-shared.cfg.in +++ b/libcxx/test/configs/llvm-libc++-shared.cfg.in @@ -7,7 +7,7 @@ '-isysroot {}'.format('@CMAKE_OSX_SYSROOT@') if '@CMAKE_OSX_SYSROOT@' else '' )) config.substitutions.append(('%{compile_flags}', - '-nostdinc++ -isystem %{include} -isystem %{target-include} -I %{libcxx}/test/support -include %{libcxx}/test/support/nasty_macros.h' + '-nostdinc++ -isystem %{include} -isystem %{target-include} -I %{libcxx}/test/support' )) config.substitutions.append(('%{link_flags}', '-nostdlib++ -L %{lib} -Wl,-rpath,%{lib} -lc++ -pthread' diff --git a/libcxx/test/configs/llvm-libc++-static.cfg.in b/libcxx/test/configs/llvm-libc++-static.cfg.in --- a/libcxx/test/configs/llvm-libc++-static.cfg.in +++ b/libcxx/test/configs/llvm-libc++-static.cfg.in @@ -7,7 +7,7 @@ '-isysroot {}'.format('@CMAKE_OSX_SYSROOT@') if '@CMAKE_OSX_SYSROOT@' else '' )) config.substitutions.append(('%{compile_flags}', - '-nostdinc++ -isystem %{include} -isystem %{target-include} -I %{libcxx}/test/support -include %{libcxx}/test/support/nasty_macros.h' + '-nostdinc++ -isystem %{include} -isystem %{target-include} -I %{libcxx}/test/support' )) config.substitutions.append(('%{link_flags}', '-nostdlib++ -L %{lib} -lc++ -lc++abi -pthread' diff --git a/libcxx/test/libcxx/nasty_macros.compile.pass.cpp b/libcxx/test/libcxx/nasty_macros.compile.pass.cpp new file mode 100644 --- /dev/null +++ b/libcxx/test/libcxx/nasty_macros.compile.pass.cpp @@ -0,0 +1,346 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +// Test that headers are not tripped up by the surrounding code defining various +// alphabetic macros. + +// Prevent from generating deprecated warnings for this test. +#if defined(__DEPRECATED) +# undef __DEPRECATED +#endif + +#define NASTY_MACRO This should not be expanded!!! + +#define _A NASTY_MACRO +#define _B NASTY_MACRO +// Windows' uses _C as an identifier +#ifndef _WIN32 +# define _C NASTY_MACRO +#endif +#define _D NASTY_MACRO +#define _E NASTY_MACRO +#define _F NASTY_MACRO +#define _G NASTY_MACRO +#define _H NASTY_MACRO +#define _I NASTY_MACRO +#define _J NASTY_MACRO +#define _K NASTY_MACRO +#define _L NASTY_MACRO +// FreeBSD's uses _M +#ifndef __FreeBSD__ +# define _M NASTY_MACRO +#endif +#define _N NASTY_MACRO +#define _O NASTY_MACRO +// MinGW's uses _P as an identifier +#ifndef _WIN32 +# define _P NASTY_MACRO +#endif +#define _Q NASTY_MACRO +#define _R NASTY_MACRO +#define _S NASTY_MACRO +#define _T NASTY_MACRO +#define _U NASTY_MACRO +#define _V NASTY_MACRO +#define _W NASTY_MACRO +#define _X NASTY_MACRO +#define _Y NASTY_MACRO +#define _Z NASTY_MACRO + +// tchar.h defines these macros on Windows. +#define _UI NASTY_MACRO +#define _PUC NASTY_MACRO +#define _CPUC NASTY_MACRO +#define _PC NASTY_MACRO +#define _CRPC NASTY_MACRO +#define _CPC NASTY_MACRO + +// yvals.h on MINGW defines this macro +#define _C2 NASTY_MACRO + +// Test that libc++ doesn't use names reserved by WIN32 API Macros. +// NOTE: Obviously we can only define these on non-windows platforms. +#ifndef _WIN32 +#define __allocator NASTY_MACRO +#define __deallocate NASTY_MACRO +#define __deref NASTY_MACRO +#define __full NASTY_MACRO +#define __in NASTY_MACRO +#define __inout NASTY_MACRO +#define __nz NASTY_MACRO +#define __out NASTY_MACRO +#define __part NASTY_MACRO +#define __post NASTY_MACRO +#define __pre NASTY_MACRO +#endif + +#define __input NASTY_MACRO +#define __output NASTY_MACRO + +#define __acquire NASTY_MACRO +#define __release NASTY_MACRO + +// These names are not reserved, so the user can macro-define them. +// These are intended to find improperly _Uglified template parameters. +#define A NASTY_MACRO +#define Arg NASTY_MACRO +#define Args NASTY_MACRO +#define As NASTY_MACRO +#define B NASTY_MACRO +#define Bs NASTY_MACRO +#define C NASTY_MACRO +#define Cp NASTY_MACRO +#define Cs NASTY_MACRO +#define D NASTY_MACRO +#define Dp NASTY_MACRO +#define Ds NASTY_MACRO +#define E NASTY_MACRO +#define Ep NASTY_MACRO +#define Es NASTY_MACRO +#define R NASTY_MACRO +#define Rp NASTY_MACRO +#define Rs NASTY_MACRO +#define T NASTY_MACRO +#define Tp NASTY_MACRO +#define Ts NASTY_MACRO +#define Type NASTY_MACRO +#define Types NASTY_MACRO +#define U NASTY_MACRO +#define Up NASTY_MACRO +#define Us NASTY_MACRO +#define V NASTY_MACRO +#define Vp NASTY_MACRO +#define Vs NASTY_MACRO +#define X NASTY_MACRO +#define Xp NASTY_MACRO +#define Xs NASTY_MACRO + +//////////////////////////////////////////////////////////////////////////////// +// BEGIN-GENERATED-HEADERS +//////////////////////////////////////////////////////////////////////////////// + +// clang-format off + +// WARNING: This test was generated by generate_header_tests.py +// and should not be edited manually. + +// Top level headers +#include +#include +#include +#include +#ifndef _LIBCPP_HAS_NO_THREADS +# include +#endif +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#ifndef _LIBCPP_HAS_NO_LOCALIZATION +# include +#endif +#include +#ifndef _LIBCPP_HAS_NO_LOCALIZATION +# include +#endif +#include +#include +#include +#include +#include +#ifndef _LIBCPP_HAS_NO_CXX20_COROUTINES +# include +#endif +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS +# include +#endif +#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS +# include +#endif +#include +#include +#include +#include +#include +#ifndef _LIBCPP_HAS_NO_FILESYSTEM_LIBRARY +# include +#endif +#include +#ifndef _LIBCPP_HAS_NO_INCOMPLETE_FORMAT +# include +#endif +#include +#ifndef _LIBCPP_HAS_NO_LOCALIZATION +# include +#endif +#include +#ifndef _LIBCPP_HAS_NO_THREADS +# include +#endif +#include +#include +#ifndef _LIBCPP_HAS_NO_LOCALIZATION +# include +#endif +#ifndef _LIBCPP_HAS_NO_LOCALIZATION +# include +#endif +#include +#ifndef _LIBCPP_HAS_NO_LOCALIZATION +# include +#endif +#ifndef _LIBCPP_HAS_NO_LOCALIZATION +# include +#endif +#include +#ifndef _LIBCPP_HAS_NO_THREADS +# include +#endif +#include +#include +#include +#ifndef _LIBCPP_HAS_NO_LOCALIZATION +# include +#endif +#ifndef _LIBCPP_HAS_NO_LOCALIZATION +# include +#endif +#include +#include +#include +#ifndef _LIBCPP_HAS_NO_THREADS +# include +#endif +#include +#include +#include +#include +#ifndef _LIBCPP_HAS_NO_LOCALIZATION +# include +#endif +#include +#include +#ifndef _LIBCPP_HAS_NO_INCOMPLETE_RANGES +# include +#endif +#include +#ifndef _LIBCPP_HAS_NO_LOCALIZATION +# include +#endif +#include +#ifndef _LIBCPP_HAS_NO_THREADS +# include +#endif +#include +#include +#ifndef _LIBCPP_HAS_NO_THREADS +# include +#endif +#include +#ifndef _LIBCPP_HAS_NO_LOCALIZATION +# include +#endif +#include +#include +#include +#include +#include +#include +#include +#ifndef _LIBCPP_HAS_NO_LOCALIZATION +# include +#endif +#include +#include +#include +#ifndef _LIBCPP_HAS_NO_LOCALIZATION +# include +#endif +#include +#include +#ifndef _LIBCPP_HAS_NO_THREADS +# include +#endif +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS +# include +#endif +#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS +# include +#endif + +// experimental headers +#if __cplusplus >= 201103L +# include +# ifndef _LIBCPP_HAS_NO_EXPERIMENTAL_COROUTINES +# include +# endif +# include +# ifndef _LIBCPP_HAS_NO_FILESYSTEM_LIBRARY +# include +# endif +# include +# include +# include +# include +# include +# include +# include +# ifndef _LIBCPP_HAS_NO_LOCALIZATION +# include +# endif +# include +# include +# include +# include +# include +# include +# include +# include +#endif // __cplusplus >= 201103L + +// extended headers +#include +#include + +// clang-format on + +//////////////////////////////////////////////////////////////////////////////// +// END-GENERATED-HEADERS +//////////////////////////////////////////////////////////////////////////////// diff --git a/libcxx/test/support/nasty_macros.h b/libcxx/test/support/nasty_macros.h deleted file mode 100644 --- a/libcxx/test/support/nasty_macros.h +++ /dev/null @@ -1,76 +0,0 @@ -//===----------------------------------------------------------------------===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// -#ifndef SUPPORT_NASTY_MACROS_H -#define SUPPORT_NASTY_MACROS_H - -#define NASTY_MACRO This should not be expanded!!! -#define _A NASTY_MACRO -#define _B NASTY_MACRO -#define _C NASTY_MACRO -#define _D NASTY_MACRO -#define _E NASTY_MACRO -#define _F NASTY_MACRO -#define _G NASTY_MACRO -#define _H NASTY_MACRO -#define _I NASTY_MACRO -#define _J NASTY_MACRO -#define _K NASTY_MACRO -#define _L NASTY_MACRO -// Because FreeBSD uses _M in its , and it is hard to avoid -// including that header, only define _M for other operating systems. -#ifndef __FreeBSD__ -#define _M NASTY_MACRO -#endif -#define _N NASTY_MACRO -#define _O NASTY_MACRO -#define _P NASTY_MACRO -#define _Q NASTY_MACRO -#define _R NASTY_MACRO -#define _S NASTY_MACRO -#define _T NASTY_MACRO -#define _U NASTY_MACRO -#define _V NASTY_MACRO -#define _W NASTY_MACRO -#define _X NASTY_MACRO -#define _Y NASTY_MACRO -#define _Z NASTY_MACRO - -// tchar.h defines these macros on Windows. -#define _UI NASTY_MACRO -#define _PUC NASTY_MACRO -#define _CPUC NASTY_MACRO -#define _PC NASTY_MACRO -#define _CRPC NASTY_MACRO -#define _CPC NASTY_MACRO - -// yvals.h on MINGW defines this macro -#define _C2 NASTY_MACRO - -// Test that libc++ doesn't use names reserved by WIN32 API Macros. -// NOTE: Obviously we can only define these on non-windows platforms. -#ifndef _WIN32 -#define __allocator NASTY_MACRO -#define __deallocate NASTY_MACRO -#define __deref NASTY_MACRO -#define __full NASTY_MACRO -#define __in NASTY_MACRO -#define __inout NASTY_MACRO -#define __nz NASTY_MACRO -#define __out NASTY_MACRO -#define __part NASTY_MACRO -#define __post NASTY_MACRO -#define __pre NASTY_MACRO -#endif - -#define __output NASTY_MACRO -#define __input NASTY_MACRO - -#define __acquire NASTY_MACRO -#define __release NASTY_MACRO - -#endif // SUPPORT_NASTY_MACROS_H diff --git a/libcxx/utils/generate_header_tests.py b/libcxx/utils/generate_header_tests.py --- a/libcxx/utils/generate_header_tests.py +++ b/libcxx/utils/generate_header_tests.py @@ -203,10 +203,9 @@ def main(): produce_test('double_include.sh.cpp') - produce_test('min_max_macros.compile.pass.cpp', - post_include='TEST_MACROS();') - produce_test('no_assert_include.compile.pass.cpp', - exclusions=['cassert']) + produce_test('min_max_macros.compile.pass.cpp', post_include='TEST_MACROS();') + produce_test('nasty_macros.compile.pass.cpp') + produce_test('no_assert_include.compile.pass.cpp', exclusions=['cassert']) if __name__ == '__main__': diff --git a/libcxx/utils/libcxx/test/config.py b/libcxx/utils/libcxx/test/config.py --- a/libcxx/utils/libcxx/test/config.py +++ b/libcxx/utils/libcxx/test/config.py @@ -288,11 +288,6 @@ def configure_compile_flags_header_includes(self): support_path = os.path.join(self.libcxx_src_root, 'test', 'support') - if self.cxx_stdlib_under_test != 'libstdc++' and \ - not self.target_info.is_windows() and \ - not self.target_info.is_zos(): - self.cxx.compile_flags += [ - '-include', os.path.join(support_path, 'nasty_macros.h')] if self.cxx_stdlib_under_test == 'msvc': self.cxx.compile_flags += [ '-include', os.path.join(support_path,