diff --git a/stl/inc/xstring b/stl/inc/xstring index 1fb054df5b..b034af9425 100644 --- a/stl/inc/xstring +++ b/stl/inc/xstring @@ -190,27 +190,27 @@ struct _Char_traits { // properties of a string or stream element } } - _NODISCARD static constexpr bool eq(const _Elem& _Left, const _Elem& _Right) noexcept { + _NODISCARD static constexpr bool eq(const _Elem _Left, const _Elem _Right) noexcept { return _Left == _Right; } - _NODISCARD static constexpr bool lt(const _Elem& _Left, const _Elem& _Right) noexcept { + _NODISCARD static constexpr bool lt(const _Elem _Left, const _Elem _Right) noexcept { return _Left < _Right; } - _NODISCARD static constexpr _Elem to_char_type(const int_type& _Meta) noexcept { + _NODISCARD static constexpr _Elem to_char_type(const int_type _Meta) noexcept { return static_cast<_Elem>(_Meta); } - _NODISCARD static constexpr int_type to_int_type(const _Elem& _Ch) noexcept { + _NODISCARD static constexpr int_type to_int_type(const _Elem _Ch) noexcept { return static_cast(_Ch); } - _NODISCARD static constexpr bool eq_int_type(const int_type& _Left, const int_type& _Right) noexcept { + _NODISCARD static constexpr bool eq_int_type(const int_type _Left, const int_type _Right) noexcept { return _Left == _Right; } - _NODISCARD static constexpr int_type not_eof(const int_type& _Meta) noexcept { + _NODISCARD static constexpr int_type not_eof(const int_type _Meta) noexcept { return _Meta != eof() ? _Meta : !eof(); } @@ -302,27 +302,27 @@ public: _Left = _Right; } - _NODISCARD static constexpr bool eq(const _Elem& _Left, const _Elem& _Right) noexcept { + _NODISCARD static constexpr bool eq(const _Elem _Left, const _Elem _Right) noexcept { return _Left == _Right; } - _NODISCARD static constexpr bool lt(const _Elem& _Left, const _Elem& _Right) noexcept { + _NODISCARD static constexpr bool lt(const _Elem _Left, const _Elem _Right) noexcept { return _Left < _Right; } - _NODISCARD static constexpr _Elem to_char_type(const int_type& _Meta) noexcept { + _NODISCARD static constexpr _Elem to_char_type(const int_type _Meta) noexcept { return _Meta; } - _NODISCARD static constexpr int_type to_int_type(const _Elem& _Ch) noexcept { + _NODISCARD static constexpr int_type to_int_type(const _Elem _Ch) noexcept { return _Ch; } - _NODISCARD static constexpr bool eq_int_type(const int_type& _Left, const int_type& _Right) noexcept { + _NODISCARD static constexpr bool eq_int_type(const int_type _Left, const int_type _Right) noexcept { return _Left == _Right; } - _NODISCARD static constexpr int_type not_eof(const int_type& _Meta) noexcept { + _NODISCARD static constexpr int_type not_eof(const int_type _Meta) noexcept { return _Meta != eof() ? _Meta : static_cast(!eof()); } @@ -446,27 +446,27 @@ public: _Left = _Right; } - _NODISCARD static constexpr bool eq(const _Elem& _Left, const _Elem& _Right) noexcept { + _NODISCARD static constexpr bool eq(const _Elem _Left, const _Elem _Right) noexcept { return _Left == _Right; } - _NODISCARD static constexpr bool lt(const _Elem& _Left, const _Elem& _Right) noexcept { + _NODISCARD static constexpr bool lt(const _Elem _Left, const _Elem _Right) noexcept { return static_cast(_Left) < static_cast(_Right); } - _NODISCARD static constexpr _Elem to_char_type(const int_type& _Meta) noexcept { + _NODISCARD static constexpr _Elem to_char_type(const int_type _Meta) noexcept { return static_cast<_Elem>(_Meta); } - _NODISCARD static constexpr int_type to_int_type(const _Elem& _Ch) noexcept { + _NODISCARD static constexpr int_type to_int_type(const _Elem _Ch) noexcept { return static_cast(_Ch); } - _NODISCARD static constexpr bool eq_int_type(const int_type& _Left, const int_type& _Right) noexcept { + _NODISCARD static constexpr bool eq_int_type(const int_type _Left, const int_type _Right) noexcept { return _Left == _Right; } - _NODISCARD static constexpr int_type not_eof(const int_type& _Meta) noexcept { + _NODISCARD static constexpr int_type not_eof(const int_type _Meta) noexcept { return _Meta != eof() ? _Meta : !eof(); } diff --git a/tests/std/test.lst b/tests/std/test.lst index 8e3c0ac47a..822cf153b8 100644 --- a/tests/std/test.lst +++ b/tests/std/test.lst @@ -225,6 +225,7 @@ tests\GH_003246_cmath_narrowing tests\GH_003570_allocate_at_least tests\GH_003617_vectorized_meow_element tests\GH_003676_format_large_hh_mm_ss_values +tests\GH_003735_char_traits_signatures tests\LWG2381_num_get_floating_point tests\LWG2597_complex_branch_cut tests\LWG3018_shared_ptr_function diff --git a/tests/std/tests/GH_003735_char_traits_signatures/env.lst b/tests/std/tests/GH_003735_char_traits_signatures/env.lst new file mode 100644 index 0000000000..19f025bd0e --- /dev/null +++ b/tests/std/tests/GH_003735_char_traits_signatures/env.lst @@ -0,0 +1,4 @@ +# Copyright (c) Microsoft Corporation. +# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception + +RUNALL_INCLUDE ..\usual_matrix.lst diff --git a/tests/std/tests/GH_003735_char_traits_signatures/test.compile.pass.cpp b/tests/std/tests/GH_003735_char_traits_signatures/test.compile.pass.cpp new file mode 100644 index 0000000000..cceca2eddd --- /dev/null +++ b/tests/std/tests/GH_003735_char_traits_signatures/test.compile.pass.cpp @@ -0,0 +1,46 @@ +// Copyright (c) Microsoft Corporation. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception + +#include +#include +#include +#include +#include + +#define STATIC_ASSERT(...) static_assert(__VA_ARGS__, #__VA_ARGS__) + +using namespace std; + +// Also ensure that the member type int_type is correct for standard specializations. +STATIC_ASSERT(is_same_v::int_type, int>); +#ifdef __cpp_char8_t +STATIC_ASSERT(is_same_v::int_type, unsigned int>); +#endif // __cpp_char8_t +STATIC_ASSERT(is_same_v::int_type, uint_least16_t>); +STATIC_ASSERT(is_same_v::int_type, uint_least32_t>); +STATIC_ASSERT(is_same_v::int_type, wint_t>); + +template +void test_n2349_char_traits_signatures() { + using IntT = typename char_traits::int_type; + + volatile CharT c{}; + volatile IntT i{}; + + (void) char_traits::eq(c, c); + (void) char_traits::lt(c, c); + (void) char_traits::not_eof(i); + (void) char_traits::to_char_type(i); + (void) char_traits::to_int_type(c); + (void) char_traits::eq_int_type(i, i); +} + +void test_n2349_char_traits_signatures_all() { + test_n2349_char_traits_signatures(); +#ifdef __cpp_char8_t + test_n2349_char_traits_signatures(); +#endif // __cpp_char8_t + test_n2349_char_traits_signatures(); + test_n2349_char_traits_signatures(); + test_n2349_char_traits_signatures(); +}