Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 13 additions & 8 deletions stl/inc/__msvc_string_view.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -360,18 +360,23 @@ struct _WChar_traits : private _Char_traits<_Elem, unsigned short> {
_NODISCARD static _CONSTEXPR17 int compare(_In_reads_(_Count) const _Elem* const _First1,
_In_reads_(_Count) const _Elem* const _First2, const size_t _Count) noexcept /* strengthened */ {
// compare [_First1, _First1 + _Count) with [_First2, ...)
#if _HAS_CXX17
if (_STD _Is_constant_evaluated()) {
if constexpr (is_same_v<_Elem, wchar_t>) {
return __builtin_wmemcmp(_First1, _First2, _Count);
#if _USE_STD_VECTOR_ALGORITHMS
if (!_STD _Is_constant_evaluated()) {
// TRANSITION, GH-2289: Use vectorized algorithms for better performance than __builtin_wmemcmp.
const size_t _Pos = _Mismatch_vectorized<sizeof(_Elem)>(_First1, _First2, _Count);
if (_Pos == _Count) {
return 0;
} else {
return _Primary_char_traits::compare(_First1, _First2, _Count);
return _First1[_Pos] < _First2[_Pos] ? -1 : +1;
}
}
#endif // _HAS_CXX17
#endif // ^^^ _USE_STD_VECTOR_ALGORITHMS ^^^

return _CSTD wmemcmp(
reinterpret_cast<const wchar_t*>(_First1), reinterpret_cast<const wchar_t*>(_First2), _Count);
if constexpr (is_same_v<_Elem, wchar_t>) {
return __builtin_wmemcmp(_First1, _First2, _Count);
} else {
return _Primary_char_traits::compare(_First1, _First2, _Count);
}
}

_NODISCARD static _CONSTEXPR17 size_t length(_In_z_ const _Elem* _First) noexcept /* strengthened */ {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,8 +23,6 @@
using namespace std;
using namespace chrono;

constexpr auto intmax_max = numeric_limits<intmax_t>::max();

template <typename CharT>
[[nodiscard]] constexpr const CharT* choose_literal(const char* const str, const wchar_t* const wstr) noexcept {
if constexpr (is_same_v<CharT, char>) {
Expand Down Expand Up @@ -252,8 +250,6 @@ void empty_braces_helper(

template <typename CharT>
void test_duration_formatter() {
using LongRatio = ratio<intmax_max - 1, intmax_max>;

empty_braces_helper(seconds{5}, STR("5s"));
empty_braces_helper(minutes{7}, STR("7min"));
empty_braces_helper(hours{9}, STR("9h"));
Expand All @@ -266,8 +262,13 @@ void test_duration_formatter() {
empty_braces_helper(duration<int, ratio<22, 7>>{40}, STR("40[22/7]s"));
empty_braces_helper(duration<int, ratio<53, 101>>{40}, STR("40[53/101]s"));
empty_braces_helper(duration<int, ratio<201, 2147483647>>{40}, STR("40[201/2147483647]s"));
// TRANSITION, LWG-3921: duration_cast used in formatting may raise UB

#if 0 // TRANSITION, LWG-3921: Our duration formatting constructs an hh_mm_ss, which calls duration_cast,
// which triggers signed integer overflow when a duration has a pathological ratio, like this:
constexpr auto intmax_max = numeric_limits<intmax_t>::max();
using LongRatio = ratio<intmax_max - 1, intmax_max>;
empty_braces_helper(duration<int, LongRatio>{1}, STR("1[9223372036854775806/9223372036854775807]s"));
#endif // ^^^ disabled test due to undefined behavior ^^^

// formatting small types needs to work as iostreams << VSO-1521926
empty_braces_helper(duration<long long, atto>{123}, STR("123as"));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -46,8 +46,7 @@ PM_COMPILER="clang-cl" PM_CL="-fno-ms-compatibility -fno-delayed-template-parsin
PM_COMPILER="clang-cl" PM_CL="-fno-ms-compatibility -fno-delayed-template-parsing -Wno-unqualified-std-cast-call /EHsc /MDd /std:c++17 /w14640 /Zc:threadSafeInit- --start-no-unused-arguments"
PM_COMPILER="clang-cl" PM_CL="-fno-ms-compatibility -fno-delayed-template-parsing -Wno-unqualified-std-cast-call /EHsc /MT /std:c++20 /permissive- /w14640 /Zc:threadSafeInit- --start-no-unused-arguments"
PM_COMPILER="clang-cl" PM_CL="-fno-ms-compatibility -fno-delayed-template-parsing -Wno-unqualified-std-cast-call /EHsc /MTd /std:c++latest /permissive- /w14640 /Zc:threadSafeInit- --start-no-unused-arguments"
# TRANSITION, GH-3568
# PM_COMPILER="clang-cl" PM_CL="-fno-ms-compatibility -fno-delayed-template-parsing -Wno-unqualified-std-cast-call /EHsc /MT /std:c++latest /permissive- /w14640 /Zc:threadSafeInit- -fsanitize=undefined -fno-sanitize-recover=undefined --start-no-unused-arguments"
PM_COMPILER="clang-cl" PM_CL="-fno-ms-compatibility -fno-delayed-template-parsing -Wno-unqualified-std-cast-call /EHsc /MT /std:c++latest /permissive- /w14640 /Zc:threadSafeInit- -fsanitize=undefined -fno-sanitize-recover=undefined --start-no-unused-arguments"
RUNALL_CROSSLIST
* PM_CL="/fp:strict"
* PM_CL="/fp:precise"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -172,9 +172,19 @@ namespace test_mismatch_sizes_and_alignments {

template <class T, size_t Size, size_t PadSize>
char stack_array_various_alignments_impl() {
#ifdef __clang__
#if __has_feature(undefined_behavior_sanitizer)
#define TESTING_UBSAN
#endif
#endif

#ifdef TESTING_UBSAN
// Avoid testing misaligned inputs, which UBSan would reject.
#else // ^^^ UBSan / no UBSan vvv
with_pad<T, Size + 1, PadSize + 1> a = {};
with_pad<T, Size + 1, PadSize + 1> b = {};
assert(mismatch(begin(a.v), end(a.v), begin(b.v), end(b.v)) == make_pair(end(a.v), end(b.v)));
#endif // ^^^ no UBSan ^^^
return 0;
}

Expand Down
3 changes: 1 addition & 2 deletions tests/std/tests/usual_matrix.lst
Original file line number Diff line number Diff line change
Expand Up @@ -53,5 +53,4 @@ PM_COMPILER="clang-cl" PM_CL="-fno-ms-compatibility -fno-delayed-template-parsin
PM_COMPILER="clang-cl" PM_CL="-fno-ms-compatibility -fno-delayed-template-parsing -Wno-unqualified-std-cast-call /EHsc /MDd /std:c++17 /w14640 /Zc:threadSafeInit- --start-no-unused-arguments"
PM_COMPILER="clang-cl" PM_CL="-fno-ms-compatibility -fno-delayed-template-parsing -Wno-unqualified-std-cast-call /EHsc /MT /std:c++20 /permissive- /w14640 /Zc:threadSafeInit- --start-no-unused-arguments"
PM_COMPILER="clang-cl" PM_CL="-fno-ms-compatibility -fno-delayed-template-parsing -Wno-unqualified-std-cast-call /EHsc /MTd /std:c++latest /permissive- /fp:strict /w14640 /Zc:threadSafeInit- --start-no-unused-arguments"
# TRANSITION, GH-3568
# PM_COMPILER="clang-cl" PM_CL="-fno-ms-compatibility -fno-delayed-template-parsing -Wno-unqualified-std-cast-call /EHsc /MT /std:c++latest /permissive- /fp:strict /w14640 /Zc:threadSafeInit- -fsanitize=undefined -fno-sanitize-recover=undefined --start-no-unused-arguments"
PM_COMPILER="clang-cl" PM_CL="-fno-ms-compatibility -fno-delayed-template-parsing -Wno-unqualified-std-cast-call /EHsc /MT /std:c++latest /permissive- /fp:strict /w14640 /Zc:threadSafeInit- -fsanitize=undefined -fno-sanitize-recover=undefined --start-no-unused-arguments"
3 changes: 1 addition & 2 deletions tests/utils/stl/test/features.py
Original file line number Diff line number Diff line change
Expand Up @@ -52,8 +52,7 @@ def getDefaultFeatures(config, litConfig):
DEFAULT_FEATURES.append(Feature(name='x86'))

elif litConfig.target_arch.casefold() == 'x64'.casefold():
# TRANSITION, GH-3568
# DEFAULT_FEATURES.append(Feature(name='ubsan'))
DEFAULT_FEATURES.append(Feature(name='ubsan'))
DEFAULT_FEATURES.append(Feature(name='edg'))
DEFAULT_FEATURES.append(Feature(name='arch_avx2'))
DEFAULT_FEATURES.append(Feature(name='x64'))
Expand Down