aboutsummaryrefslogtreecommitdiff
path: root/libstdc++-v3/testsuite
AgeCommit message (Collapse)AuthorFilesLines
2021-12-01libstdc++: Clear RB tree after moving elements [PR103501]Jonathan Wakely4-2/+66
If the allocator-extended move constructor move-constructs each element into the new container, the contents of the old container are left in moved-from states. We cannot know if those states preserve the container's ordering and uniqueness guarantees, so just erase all moved-from elements. libstdc++-v3/ChangeLog: PR libstdc++/103501 * include/bits/stl_tree.h (_Rb_tree(_Rb_tree&&, false_type)): Clear container if elements have been moved-from. * testsuite/23_containers/map/allocator/move_cons.cc: Expect moved-from container to be empty. * testsuite/23_containers/multimap/allocator/move_cons.cc: Likewise. * testsuite/23_containers/multiset/allocator/103501.cc: New test. * testsuite/23_containers/set/allocator/103501.cc: New test.
2021-12-01libstdc++: Define std::__is_constant_evaluated() for internal useJonathan Wakely1-3/+3
This adds std::__is_constant_evaluated() as a C++11 wrapper for __builtin_is_constant_evaluated, but just returning false if the built-in isn't supported by the compiler. This allows us to use it throughout the library without checking __has_builtin every time. Some uses in std::vector and std::string can only be constexpr when the std::is_constant_evaluated() function actually works, so we might as well guard them with a relevant macro and call that function directly, rather than the built-in or std::__is_constant_evaluated(). The remaining checks of the __cpp_lib_is_constant_evaluated macro could now be replaced by checking __cplusplus >= 202002 instead, but there's no practical difference. We still need some kind of preprocessor check there anyway. libstdc++-v3/ChangeLog: * doc/doxygen/user.cfg.in (PREDEFINED): Change macro name. * include/bits/allocator.h (allocate, deallocate): Use std::__is_constant_evaluated() unconditionally, instead of checking whether std::is_constant_evaluated() (or the built-in) can be used. * include/bits/basic_string.h: Check new macro. call std::is_constant_evaluated() directly in C++20-only code that is guarded by a suitable macro. * include/bits/basic_string.tcc: Likewise. * include/bits/c++config (__is_constant_evaluated): Define. (_GLIBCXX_HAVE_BUILTIN_IS_CONSTANT_EVALUATED): Replace with ... (_GLIBCXX_HAVE_IS_CONSTANT_EVALUATED): New macro. * include/bits/char_traits.h (char_traits): Replace conditional calls to std::is_constant_evaluated with unconditional calls to std::__is_constant_evaluated. * include/bits/cow_string.h: Use new macro. * include/bits/ranges_algobase.h (__copy_or_move): Replace conditional calls to std::is_constant_evaluated with unconditional calls to std::__is_constant_evaluated. (__copy_or_move_backward, __fill_n_fn): Likewise. * include/bits/ranges_cmp.h (ranges::less): Likewise. * include/bits/stl_algobase.h (lexicographical_compare_three_way): Likewise. * include/bits/stl_bvector.h: Call std::is_constant_evaluated directly in C++20-only code that is guarded by a suitable macro. * include/bits/stl_construct.h (_Construct, _Destroy, _Destroy_n): Replace is_constant_evaluated with __is_constant_evaluated. * include/bits/stl_function.h (greater, less, greater_equal) (less_equal): Replace __builtin_is_constant_evaluated and __builtin_constant_p with __is_constant_evaluated. * include/bits/stl_vector.h: Call std::is_constant_evaluated() in C++20-only code. * include/debug/helper_functions.h (__check_singular): Use __is_constant_evaluated instead of built-in, or remove check entirely. * include/std/array (operator<=>): Use __is_constant_evaluated unconditionally. * include/std/bit (__bit_ceil): Likewise. * include/std/type_traits (is_constant_evaluated): Define using 'if consteval' if possible. * include/std/version: Use new macro. * libsupc++/compare: Use __is_constant_evaluated instead of __builtin_is_constant_evaluated. * testsuite/23_containers/array/tuple_interface/get_neg.cc: Adjust dg-error lines.
2021-11-30libstdc++: Fix tests that fail with fully-dynamic-stringJonathan Wakely8-8/+20
Fix some tests that assume that a moved-from string is empty, or that default constructing a string doesn't allocate. libstdc++-v3/ChangeLog: * testsuite/21_strings/basic_string/cons/char/moveable.cc: Allow moved-from string to be non-empty. * testsuite/21_strings/basic_string/cons/char/moveable2.cc: Likewise. * testsuite/21_strings/basic_string/cons/char/moveable2_c++17.cc: Likewise. * testsuite/21_strings/basic_string/cons/wchar_t/moveable.cc: Likewise. * testsuite/21_strings/basic_string/cons/wchar_t/moveable2.cc: Likewise. * testsuite/21_strings/basic_string/cons/wchar_t/moveable2_c++17.cc: Likewise. * testsuite/21_strings/basic_string/modifiers/assign/char/87749.cc: Construct empty string before setting oom flag. * testsuite/21_strings/basic_string/modifiers/assign/wchar_t/87749.cc: Likewise.
2021-11-30libstdc++: Fix fully-dynamic-string buildJonathan Wakely2-2/+0
My last change to the fully-dynamic-string actually broke it. This fixes the move constructor so it builds, and simplifies it slightly so that more code is common between the fully-dynamic enabled/disabled cases. libstdc++-v3/ChangeLog: * include/bits/cow_string.h (basic_string(basic_string&&)): Fix mem-initializer for _GLIBCXX_FULLY_DYNAMIC_STRING==0 case. * testsuite/21_strings/basic_string/cons/char/noexcept_move_construct.cc: Remove outdated comment. * testsuite/21_strings/basic_string/cons/wchar_t/noexcept_move_construct.cc: Likewise.
2021-11-28libstdc++: Implement std::byteswap for C++23Jakub Jelinek2-0/+139
This patch attempts to implement P1272R4 (except for the std::bit_cast changes in there which seem quite unrelated to this and will need to be fixed on the compiler side). While at least for GCC __builtin_bswap{16,32,64,128} should work fine in constant expressions, I wonder about other compilers, so I'm using a fallback implementation for constexpr evaluation always. If you think that is unnecessary, I can drop the __cpp_if_consteval >= 202106L && if !consteval { and } and reformat. The fallback implementation is an attempt to make it work even for integral types that don't have number of bytes divisible by 2 or when __CHAR_BIT__ is e.g. 16. 2021-11-28 Jakub Jelinek <jakub@redhat.com> * include/std/bit (__cpp_lib_byteswap, byteswap): Define. * include/std/version (__cpp_lib_byteswap): Define. * testsuite/26_numerics/bit/bit.byteswap/byteswap.cc: New test. * testsuite/26_numerics/bit/bit.byteswap/version.cc: New test.
2021-11-26libstdc++: Fix test that fails in C++20 modeJonathan Wakely1-10/+15
This test was written to verify that the LWG 3265 changes work. But those changes were superseded by LWG 3435, and the test is now incorrect according to the current draft. The assignment operator is now constrained to also require convertibility, which makes the test fail. Change the Iter type to be convertible from int*, but make it throw an exception if that conversion is used. Change the test from compile-only to run, so we verify that the exception isn't thrown. libstdc++-v3/ChangeLog: * testsuite/24_iterators/move_iterator/dr3265.cc: Fix test to account for LWG 3435 resolution.
2021-11-26libstdc++: Ensure dg-add-options comes after dg-optionsJonathan Wakely1-1/+1
This is what the docs say is required. libstdc++-v3/ChangeLog: * testsuite/29_atomics/atomic_float/1.cc: Reorder directives.
2021-11-26libstdc++: Fix dg-do directive for tests supposed to be runJonathan Wakely2-2/+2
libstdc++-v3/ChangeLog: * testsuite/23_containers/unordered_map/modifiers/move_assign.cc: Change dg-do compile to run. * testsuite/27_io/basic_istream/extractors_character/wchar_t/lwg2499.cc: Likewise.
2021-11-26libstdc++: Remove redundant xfail selectors in dg-do compile testsJonathan Wakely17-17/+17
An 'xfail' selector means the test is expected to fail at runtime, so is ignored for a compile-only test. The way to mark a compile-only test as failing is with dg-error (which these already do). libstdc++-v3/ChangeLog: * testsuite/21_strings/basic_string_view/element_access/char/back_constexpr_neg.cc: Remove xfail selector. * testsuite/21_strings/basic_string_view/element_access/char/constexpr_neg.cc: Likewise. Likewise. * testsuite/21_strings/basic_string_view/element_access/char/front_constexpr_neg.cc: Likewise. * testsuite/21_strings/basic_string_view/element_access/wchar_t/back_constexpr_neg.cc: Likewise. * testsuite/21_strings/basic_string_view/element_access/wchar_t/constexpr_neg.cc: Likewise. * testsuite/21_strings/basic_string_view/element_access/wchar_t/front_constexpr_neg.cc: Likewise. * testsuite/23_containers/span/101411.cc: Likewise. * testsuite/25_algorithms/copy/debug/constexpr_neg.cc: Likewise. * testsuite/25_algorithms/copy_backward/debug/constexpr_neg.cc: Likewise. * testsuite/25_algorithms/equal/constexpr_neg.cc: Likewise. * testsuite/25_algorithms/equal/debug/constexpr_neg.cc: Likewise. * testsuite/25_algorithms/lower_bound/debug/constexpr_partitioned_neg.cc: Likewise. * testsuite/25_algorithms/lower_bound/debug/constexpr_partitioned_pred_neg.cc: Likewise. * testsuite/25_algorithms/lower_bound/debug/constexpr_valid_range_neg.cc: Likewise. * testsuite/25_algorithms/upper_bound/debug/constexpr_partitioned_neg.cc: Likewise. * testsuite/25_algorithms/upper_bound/debug/constexpr_partitioned_pred_neg.cc: Likewise. * testsuite/25_algorithms/upper_bound/debug/constexpr_valid_range_neg.cc: Likewise.
2021-11-26libstdc++: Move std::to_address tests to more appropriate placeJonathan Wakely2-20/+26
Some of the checks in 20_util/pointer_traits/lwg3545.cc really belong in 20_util/to_address/lwg3545 instead. This also fixes the ordering of the dg-options and dg-do directives. libstdc++-v3/ChangeLog: * testsuite/20_util/pointer_traits/lwg3545.cc: Move to_address tests to ... * testsuite/20_util/to_address/lwg3545.cc: ... here. Add -std option before checking effective target.
2021-11-25libstdc++: Remove dg-error that no longer happensJonathan Wakely1-1/+0
There was a c++11_only dg-error in this testcase, for a "body of constexpr function is not a return statement" diagnostic that was bogus, but happened because the return statement was ill-formed. A change to G++ earlier this month means that diagnostic is no longer emitted, so remove the dg-error. libstdc++-v3/ChangeLog: * testsuite/20_util/tuple/comparison_operators/overloaded2.cc: Remove dg-error for C++11_only error.
2021-11-25libstdc++: Make std::pointer_traits SFINAE-friendly [PR96416]Jonathan Wakely3-1/+133
This implements the resolution I'm proposing for LWG 3545, to avoid hard errors when using std::to_address for types that make pointer_traits ill-formed. Consistent with std::iterator_traits, instantiating std::pointer_traits for a non-pointer type will be well-formed, but give an empty type with no member types. This avoids the problematic cases for std::to_address. Additionally, the pointer_to member is now only declared when the element type is not cv void (and for C++20, when the function body would be well-formed). The rebind member was already SFINAE-friendly in our implementation. libstdc++-v3/ChangeLog: PR libstdc++/96416 * include/bits/ptr_traits.h (pointer_traits): Reimplement to be SFINAE-friendly (LWG 3545). * testsuite/20_util/pointer_traits/lwg3545.cc: New test. * testsuite/20_util/to_address/1_neg.cc: Adjust dg-error line. * testsuite/20_util/to_address/lwg3545.cc: New test.
2021-11-25libstdc++: Do not use memset in constexpr calls to ranges::fill_n [PR101608]Jonathan Wakely1-2/+4
libstdc++-v3/ChangeLog: PR libstdc++/101608 * include/bits/ranges_algobase.h (__fill_n_fn): Check for constant evaluation before using memset. * testsuite/25_algorithms/fill_n/constrained.cc: Check byte-sized values as well.
2021-11-24libstdc++: Add xfail to some printer tests for debug modeJonathan Wakely2-3/+3
The type printers are not substituting std::string for std::basic_string<char> in debug mode, mark some tests as xfail. libstdc++-v3/ChangeLog: * testsuite/libstdc++-prettyprinters/80276.cc: Add xfail for debug mode. * testsuite/libstdc++-prettyprinters/libfundts.cc: Likewise.
2021-11-24libstdc++: Replace hyphens in effective target keywordsJonathan Wakely142-153/+153
An effective target like foo-bar-baz will match a target selector of *-*-* and cause problems in the testsuite. Several libstdc++ et keywords are of the form foo-bar, which could still be a problem for *-* selectors. Replace hyphens with underscores in the et keywords "debug-mode", "cxx11-abi", etc. libstdc++-v3/ChangeLog: * testsuite/lib/libstdc++.exp: Rename effective target keywords to avoid dashes in the name. * testsuite/*: Update effective targe keywords.
2021-11-23libstdc++: Add another testcase for std::unique_ptr printer [PR103086]Jonathan Wakely1-0/+11
libstdc++-v3/ChangeLog: PR libstdc++/103086 * testsuite/libstdc++-prettyprinters/cxx11.cc: Check unique_ptr with non-empty pointer and non-empty deleter.
2021-11-23libstdc++: Add effective-target for std::allocator implementationJonathan Wakely10-5/+19
This allows tests to be skipped if the std::allocator implementation is not __gnu_cxx::new_allocator. The 20_util/allocator/overaligned.cc test requires either C++17 or new_allocator, otherwise we can't guarantee to return overaligned memory. libstdc++-v3/ChangeLog: * testsuite/18_support/50594.cc: Check effective target. * testsuite/20_util/allocator/1.cc: Likewise. * testsuite/20_util/allocator/overaligned.cc: Likewise. * testsuite/23_containers/unordered_map/96088.cc: Likewise. * testsuite/23_containers/unordered_multimap/96088.cc: Likewise. * testsuite/23_containers/unordered_multiset/96088.cc: Likewise. * testsuite/23_containers/unordered_set/96088.cc: Likewise. * testsuite/ext/throw_allocator/check_delete.cc: Likewise. * testsuite/ext/throw_allocator/check_new.cc: Likewise. * testsuite/lib/libstdc++.exp (check_effective_target_std_allocator_new): Define new proc.
2021-11-19libstdc++: Improve tests for stringstream constructors in C++20Jonathan Wakely6-88/+633
This ensures all constructors are checked. libstdc++-v3/ChangeLog: * testsuite/27_io/basic_istringstream/cons/char/1.cc: Check all constructors. * testsuite/27_io/basic_istringstream/cons/wchar_t/1.cc: Likewise. * testsuite/27_io/basic_ostringstream/cons/char/1.cc: Likewise. * testsuite/27_io/basic_ostringstream/cons/wchar_t/1.cc: Likewise. * testsuite/27_io/basic_stringstream/cons/char/1.cc: Likewise. * testsuite/27_io/basic_stringstream/cons/wchar_t/1.cc: Likewise.
2021-11-19libstdc++, testsuite: Add a prune expression for external tool bug.Iain Sandoe1-1/+4
Depending on the permutation of CPU, OS version and shared/non- shared library inclusion, we get can get warnings from the external tools (ld64, dsymutil) which are not actually libstdc++ issues but relate to the external tools themselves. This is already pruned in the main testsuite, this adds it to the library. Signed-off-by: Iain Sandoe <iain@sandoe.co.uk> libstdc++-v3/ChangeLog: * testsuite/lib/prune.exp: Prune dsymutil (ld64) warning.
2021-11-19libstdc++: Suppress -Wstringop warnings [PR103332]Jonathan Wakely3-1/+9
libstdc++-v3/ChangeLog: PR libstdc++/103332 PR libstdc++/102958 * testsuite/21_strings/basic_string/capacity/char/1.cc: Add -Wno-stringop-overflow. * testsuite/21_strings/basic_string/operators/char/1.cc: Likewise. * testsuite/experimental/filesystem/path/factory/u8path-char8_t.cc: Add -Wno-stringop-overread.
2021-11-19libstdc++: Begin lifetime of chars in constexpr std::string [PR103295]Jonathan Wakely1-0/+14
Clang gives errors for constexpr std::string because the memory returned by std::allocator<T>::allocate does not contain any objects yet, and attempting to set them using char_traits::assign or char_traits::copy fails with: assignment to object outside its lifetime is not allowed in a constant expression *__result = *__first; ^ This adds code to std::char_traits to use std::construct_at to begin lifetimes when called during constant evaluation. To support specializations of std::basic_string that don't use std::char_traits there is now another layer of wrapper around the allocator_traits, so that the lifetime of characters is begun as soon as the memory is allocated. By doing it in the char traits and allocator traits, the rest of basic_string can ignore the problem. While modifying char_traits::copy and char_traits::assign to begin lifetimes for the constexpr cases, I also replaced their uses of std::copy and std::fill_n respectively. That means we don't need <bits/stl_algobase.h> for char_traits. libstdc++-v3/ChangeLog: PR libstdc++/103295 * include/bits/basic_string.h (_Alloc_traits): Replace typedef with struct for C++20 mode. * include/bits/basic_string.tcc (_M_replace): Use _Alloc_traits for allocation. * include/bits/char_traits.h (__gnu_cxx::char_traits::assign): Use std::_Construct during constant evaluation. (__gnu_cxx::char_traits::assign(CharT*, const CharT*, size_t)): Likewise. Replace std::fill_n with memset or manual loop. (__gnu_cxx::char_traits::copy): Likewise, replacing std::copy with memcpy. * include/ext/vstring.h: Include <bits/stl_algobase.h> for std::min. * include/std/string_view: Likewise. * testsuite/21_strings/basic_string/capacity/char/resize_and_overwrite.cc: Add constexpr test.
2021-11-18libstdc++: Fix std::char_traits<C>::move for constexprJonathan Wakely1-3/+20
The constexpr branch in __gnu_cxx::char_traits::move compares the string arguments to see if they overlap, but relational comparisons between unrelated pointers are not core constant expressions. I want to replace the comparisons with a loop using pointer equality to determine whether the end of the source string is in the destination string. However, that doesn't work with GCC, due to PR c++/89074 so allocate a temporary buffer instead and copy out into that first, so that overlapping source and destination don't matter. The allocation isn't supported by the current Intel icc so use the loop as a fallback. libstdc++-v3/ChangeLog: * include/bits/char_traits.h (__gnu_cxx::char_traits::move): Do not compare unrelated pointers during constant evaluation. * testsuite/21_strings/char_traits/requirements/constexpr_functions_c++20.cc: Improve tests for char_traits::move.
2021-11-17libstdc++: Fix std::type_info::before for ARM [PR103240]Jonathan Wakely2-0/+48
The r179236 fix for std::type_info::operator== should also have been applied to std::type_info::before. Otherwise two distinct types can compare equivalent due to using a string comparison, when they should do a pointer comparison. libstdc++-v3/ChangeLog: PR libstdc++/103240 * libsupc++/tinfo2.cc (type_info::before): Use unadjusted name to check for the '*' prefix. * testsuite/util/testsuite_shared.cc: Add type_info object for use in new test. * testsuite/18_support/type_info/103240.cc: New test.
2021-11-16libstdc++: Fix tests for constexpr std::stringJonathan Wakely2-3/+31
Some tests fail when run with -D_GLIBCXX_USE_CXX11_ABI or -stdgnu++20. libstdc++-v3/ChangeLog: * include/bits/basic_string.h (operator<=>): Use constexpr unconditionally. * testsuite/21_strings/basic_string/modifiers/constexpr.cc: Require cxx11-abit effective target. * testsuite/21_strings/headers/string/synopsis.cc: Add conditional constexpr to declarations, and adjust relational operators for C++20.
2021-11-16libstdc++: Implement constexpr std::basic_string for C++20Michael de Lang7-0/+545
This is only supported for the cxx11 ABI, not for COW strings. libstdc++-v3/ChangeLog: * include/bits/basic_string.h (basic_string, operator""s): Add constexpr for C++20. (basic_string::basic_string(basic_string&&)): Only copy initialized portion of the buffer. (basic_string::basic_string(basic_string&&, const Alloc&)): Likewise. * include/bits/basic_string.tcc (basic_string): Add constexpr for C++20. (basic_string::swap(basic_string&)): Only copy initialized portions of the buffers. (basic_string::_M_replace): Add constexpr implementation that doesn't depend on pointer comparisons. * include/bits/cow_string.h: Adjust comment. * include/ext/type_traits.h (__is_null_pointer): Add constexpr. * include/std/string (erase, erase_if): Add constexpr. * include/std/version (__cpp_lib_constexpr_string): Update value. * testsuite/21_strings/basic_string/cons/char/constexpr.cc: New test. * testsuite/21_strings/basic_string/cons/wchar_t/constexpr.cc: New test. * testsuite/21_strings/basic_string/literals/constexpr.cc: New test. * testsuite/21_strings/basic_string/modifiers/constexpr.cc: New test. * testsuite/21_strings/basic_string/modifiers/swap/char/constexpr.cc: New test. * testsuite/21_strings/basic_string/modifiers/swap/wchar_t/constexpr.cc: New test. * testsuite/21_strings/basic_string/version.cc: New test.
2021-11-16libstdc++: Fix out-of-bound array accesses in testsuiteJonathan Wakely3-5/+5
I fixed some undefined behaviour in string tests in r238609, but I only fixed the narrow char versions. This applies the same fixes to the wchar_t ones. These problems were found when testing a patch to make std::basic_string usable in constexpr. libstdc++-v3/ChangeLog: * testsuite/21_strings/basic_string/modifiers/append/wchar_t/1.cc: Fix reads past the end of strings. * testsuite/21_strings/basic_string/operations/compare/wchar_t/1.cc: Likewise. * testsuite/experimental/string_view/operations/compare/wchar_t/1.cc: Likewise.
2021-11-16libstdc++: Fix typos in testsJonathan Wakely2-2/+2
libstdc++-v3/ChangeLog: * testsuite/21_strings/basic_string/allocator/71964.cc: Fix typo. * testsuite/23_containers/set/allocator/71964.cc: Likewise.
2021-11-15c++: Add -fimplicit-constexprJason Merrill2-1/+9
With each successive C++ standard the restrictions on the use of the constexpr keyword for functions get weaker and weaker; it recently occurred to me that it is heading toward the same fate as the C register keyword, which was once useful for optimization but became obsolete. Similarly, it seems to me that we should be able to just treat inlines as constexpr functions and not make people add the extra keyword everywhere. There were a lot of testcase changes needed; many disabling errors about non-constexpr functions that are now constexpr, and many disabling implicit constexpr so that the tests can check the same thing as before, whether that's mangling or whatever. gcc/c-family/ChangeLog: * c.opt: Add -fimplicit-constexpr. * c-cppbuiltin.c: Define __cpp_implicit_constexpr. * c-opts.c (c_common_post_options): Disable below C++14. gcc/cp/ChangeLog: * cp-tree.h (struct lang_decl_fn): Add implicit_constexpr. (decl_implicit_constexpr_p): New. * class.c (type_maybe_constexpr_destructor): Use TYPE_HAS_TRIVIAL_DESTRUCTOR and maybe_constexpr_fn. (finalize_literal_type_property): Simplify. * constexpr.c (is_valid_constexpr_fn): Check for dtor. (maybe_save_constexpr_fundef): Try to set DECL_DECLARED_CONSTEXPR_P on inlines. (cxx_eval_call_expression): Use maybe_constexpr_fn. (maybe_constexpr_fn): Handle flag_implicit_constexpr. (var_in_maybe_constexpr_fn): Use maybe_constexpr_fn. (potential_constant_expression_1): Likewise. (decl_implicit_constexpr_p): New. * decl.c (validate_constexpr_redeclaration): Allow change with -fimplicit-constexpr. (grok_special_member_properties): Use maybe_constexpr_fn. * error.c (dump_function_decl): Don't print 'constexpr' if it's implicit. * Make-lang.in (check-c++-all): Update. libstdc++-v3/ChangeLog: * testsuite/20_util/to_address/1_neg.cc: Adjust error. * testsuite/26_numerics/random/concept.cc: Adjust asserts. gcc/testsuite/ChangeLog: * lib/g++-dg.exp: Handle "impcx". * lib/target-supports.exp (check_effective_target_implicit_constexpr): New. * g++.dg/abi/abi-tag16.C: * g++.dg/abi/abi-tag18a.C: * g++.dg/abi/guard4.C: * g++.dg/abi/lambda-defarg1.C: * g++.dg/abi/mangle26.C: * g++.dg/cpp0x/constexpr-diag3.C: * g++.dg/cpp0x/constexpr-ex1.C: * g++.dg/cpp0x/constexpr-ice5.C: * g++.dg/cpp0x/constexpr-incomplete2.C: * g++.dg/cpp0x/constexpr-memfn1.C: * g++.dg/cpp0x/constexpr-neg3.C: * g++.dg/cpp0x/constexpr-specialization.C: * g++.dg/cpp0x/inh-ctor19.C: * g++.dg/cpp0x/inh-ctor30.C: * g++.dg/cpp0x/lambda/lambda-mangle3.C: * g++.dg/cpp0x/lambda/lambda-mangle5.C: * g++.dg/cpp1y/auto-fn12.C: * g++.dg/cpp1y/constexpr-loop5.C: * g++.dg/cpp1z/constexpr-lambda7.C: * g++.dg/cpp2a/constexpr-dtor3.C: * g++.dg/cpp2a/constexpr-new13.C: * g++.dg/cpp2a/constinit11.C: * g++.dg/cpp2a/constinit12.C: * g++.dg/cpp2a/constinit14.C: * g++.dg/cpp2a/constinit15.C: * g++.dg/cpp2a/spaceship-constexpr1.C: * g++.dg/cpp2a/spaceship-eq3.C: * g++.dg/cpp2a/udlit-class-nttp-neg2.C: * g++.dg/debug/dwarf2/auto1.C: * g++.dg/debug/dwarf2/cdtor-1.C: * g++.dg/debug/dwarf2/lambda1.C: * g++.dg/debug/dwarf2/pr54508.C: * g++.dg/debug/dwarf2/pubnames-2.C: * g++.dg/debug/dwarf2/pubnames-3.C: * g++.dg/ext/is_literal_type3.C: * g++.dg/ext/visibility/template7.C: * g++.dg/gcov/gcov-12.C: * g++.dg/gcov/gcov-2.C: * g++.dg/ipa/devirt-35.C: * g++.dg/ipa/devirt-36.C: * g++.dg/ipa/devirt-37.C: * g++.dg/ipa/devirt-44.C: * g++.dg/ipa/imm-devirt-1.C: * g++.dg/lookup/builtin5.C: * g++.dg/lto/inline-crossmodule-1_0.C: * g++.dg/modules/enum-1_a.C: * g++.dg/modules/fn-inline-1_c.C: * g++.dg/modules/pmf-1_b.C: * g++.dg/modules/used-1_c.C: * g++.dg/tls/thread_local11.C: * g++.dg/tls/thread_local11a.C: * g++.dg/tm/pr46653.C: * g++.dg/ubsan/pr70035.C: * g++.old-deja/g++.other/delete6.C: * g++.dg/modules/pmf-1_a.H: Adjust for implicit constexpr.
2021-11-15libstdc++: Unordered containers merge re-use hash codeFrançois Dumont2-0/+65
When merging 2 unordered containers with same hasher we can re-use the hash code from the cache if any. Also in the context of the merge operation on multi-container use previous insert iterator as a hint for the next insert. libstdc++-v3/ChangeLog: * include/bits/hashtable_policy.h: (_Hash_code_base<>::_M_hash_code(const _Hash&, const _Hash_node_value<_Value, true>&)): New. (_Hash_code_base<>::_M_hash_code<_H2>(const _H2&, const _Hash_node_value<>&)): New. * include/bits/hashtable.h (_Hashtable<>::_M_merge_unique): Use latter. (_Hashtable<>::_M_merge_multi): Likewise. * testsuite/23_containers/unordered_multiset/modifiers/merge.cc (test05): New test. * testsuite/23_containers/unordered_set/modifiers/merge.cc (test04): New test.
2021-11-13libstdc++: Implement std::spanstream for C++23Jonathan Wakely2-0/+63
This implements the <spanstream> header, as proposed for C++23 by P0448R4. libstdc++-v3/ChangeLog: * include/Makefile.am: Add spanstream header. * include/Makefile.in: Regenerate. * include/precompiled/stdc++.h: Add spanstream header. * include/std/version (__cpp_lib_spanstream): Define. * include/std/spanstream: New file. * testsuite/27_io/spanstream/1.cc: New test. * testsuite/27_io/spanstream/version.cc: New test.
2021-11-12libstdc++: Print assertion messages to stderr [PR59675]Jonathan Wakely1-1/+2
This replaces the printf used by failed debug assertions with fprintf, so we can write to stderr. To avoid including <stdio.h> the assert function is moved into the library. To avoid programs using a vague linkage definition of the old inline function, the function is renamed. Code compiled with old versions of GCC might still call the old function, but code compiled with the newer GCC will call the new function and write to stderr. libstdc++-v3/ChangeLog: PR libstdc++/59675 * acinclude.m4 (libtool_VERSION): Bump version. * config/abi/pre/gnu.ver (GLIBCXX_3.4.30): Add version and export new symbol. * configure: Regenerate. * include/bits/c++config (__replacement_assert): Remove, declare __glibcxx_assert_fail instead. * src/c++11/debug.cc (__glibcxx_assert_fail): New function to replace __replacement_assert, writing to stderr instead of stdout. * testsuite/util/testsuite_abi.cc: Update latest version.
2021-11-12libstdc++: Implement constexpr std::vector for C++20Jonathan Wakely20-49/+2107
This implements P1004R2 ("Making std::vector constexpr") for C++20. For now, debug mode vectors are not supported in constant expressions. To make that work we might need to disable all attaching/detaching of safe iterators. That can be fixed later. Co-authored-by: Josh Marshall <joshua.r.marshall.1991@gmail.com> libstdc++-v3/ChangeLog: * include/bits/alloc_traits.h (_Destroy): Make constexpr for C++20 mode. * include/bits/allocator.h (__shrink_to_fit::_S_do_it): Likewise. * include/bits/stl_algobase.h (__fill_a1): Declare _Bit_iterator overload constexpr for C++20. * include/bits/stl_bvector.h (_Bit_type, _S_word_bit): Move out of inline namespace. (_Bit_reference, _Bit_iterator_base, _Bit_iterator) (_Bit_const_iterator, _Bvector_impl_data, _Bvector_base) (vector<bool, A>>): Add constexpr to every member function. (_Bvector_base::_M_allocate): Initialize storage during constant evaluation. (vector<bool, A>::_M_initialize_value): Use __fill_bvector_n instead of memset. (__fill_bvector_n): New helper function to replace memset during constant evaluation. * include/bits/stl_uninitialized.h (__uninitialized_copy<false>): Move logic to ... (__do_uninit_copy): New function. (__uninitialized_fill<false>): Move logic to ... (__do_uninit_fill): New function. (__uninitialized_fill_n<false>): Move logic to ... (__do_uninit_fill_n): New function. (__uninitialized_copy_a): Add constexpr. Use __do_uninit_copy. (__uninitialized_move_a, __uninitialized_move_if_noexcept_a): Add constexpr. (__uninitialized_fill_a): Add constexpr. Use __do_uninit_fill. (__uninitialized_fill_n_a): Add constexpr. Use __do_uninit_fill_n. (__uninitialized_default_n, __uninitialized_default_n_a) (__relocate_a_1, __relocate_a): Add constexpr. * include/bits/stl_vector.h (_Vector_impl_data, _Vector_impl) (_Vector_base, vector): Add constexpr to every member function. (_Vector_impl::_S_adjust): Disable ASan annotation during constant evaluation. (_Vector_base::_S_use_relocate): Disable bitwise-relocation during constant evaluation. (vector::_Temporary_value): Use a union for storage. * include/bits/vector.tcc (vector, vector<bool>): Add constexpr to every member function. * include/std/vector (erase_if, erase): Add constexpr. * testsuite/23_containers/headers/vector/synopsis.cc: Add constexpr for C++20 mode. * testsuite/23_containers/vector/bool/cmp_c++20.cc: Change to compile-only test using constant expressions. * testsuite/23_containers/vector/bool/capacity/29134.cc: Adjust namespace for _S_word_bit. * testsuite/23_containers/vector/bool/modifiers/insert/31370.cc: Likewise. * testsuite/23_containers/vector/cmp_c++20.cc: Likewise. * testsuite/23_containers/vector/cons/89164.cc: Adjust errors for C++20 and move C++17 test to ... * testsuite/23_containers/vector/cons/89164_c++17.cc: ... here. * testsuite/23_containers/vector/bool/capacity/constexpr.cc: New test. * testsuite/23_containers/vector/bool/cons/constexpr.cc: New test. * testsuite/23_containers/vector/bool/element_access/constexpr.cc: New test. * testsuite/23_containers/vector/bool/modifiers/assign/constexpr.cc: New test. * testsuite/23_containers/vector/bool/modifiers/constexpr.cc: New test. * testsuite/23_containers/vector/bool/modifiers/swap/constexpr.cc: New test. * testsuite/23_containers/vector/capacity/constexpr.cc: New test. * testsuite/23_containers/vector/cons/constexpr.cc: New test. * testsuite/23_containers/vector/data_access/constexpr.cc: New test. * testsuite/23_containers/vector/element_access/constexpr.cc: New test. * testsuite/23_containers/vector/modifiers/assign/constexpr.cc: New test. * testsuite/23_containers/vector/modifiers/constexpr.cc: New test. * testsuite/23_containers/vector/modifiers/swap/constexpr.cc: New test.
2021-11-10libstdc++: Fix test for libstdc++ not including <unistd.h> [PR100117]Jonathan Wakely1-1/+112
The <cxxx> headers for the C library are not under our control, so we can't prevent them from including <unistd.h>. Change the PR 49745 test to only include the C++ library headers, not the <cxxx> ones. To ensure <bits/stdc++.h> isn't included automatically we need to use no_pch to disable PCH. libstdc++-v3/ChangeLog: PR libstdc++/100117 * testsuite/17_intro/headers/c++1998/49745.cc: Explicitly list all C++ headers instead of including <bits/stdc++.h>
2021-11-09libstdc++: [_GLIBCXX_DEBUG] Implement unordered container mergeFrançois Dumont17-0/+519
The _GLIBCXX_DEBUG unordered containers need a dedicated merge implementation so that any existing iterator on the transfered nodes is properly invalidated. Add typedef/using declarations for everything used as-is from normal implementation. libstdc++-v3/ChangeLog: * include/bits/hashtable_policy.h (__distance_fw): Replace class keyword with typename. * include/bits/hashtable.h (_Hashtable<>::_M_merge_unique): Remove noexcept qualification. Use const_iterator for node extraction/reinsert. (_Hashtable<>::_M_merge_multi): Likewise. Compute new hash code before extract. * include/debug/safe_container.h (_Safe_container<>): Make all methods protected. * include/debug/safe_unordered_container.h (_Safe_unordered_container<>::_UContInvalidatePred<_ExtractKey, _Source>): New. (_Safe_unordered_container<>::_UMContInvalidatePred<_ExtractKey, _Source>): New. (_Safe_unordered_container<>::_UContMergeGuard<_Source, _InvalidatePred>): New. (_Safe_unordered_container<>::_S_uc_guard<_ExtractKey, _Source>): New. (_Safe_unordered_container<>::_S_umc_guard<_ExtractKey, _Source>): New. (_Safe_unordered_container<>::_M_invalide_all): Make public. (_Safe_unordered_container<>::_M_invalide_if): Likewise. (_Safe_unordered_container<>::_M_invalide_local_if): Likewise. * include/debug/unordered_map (unordered_map<>::mapped_type, pointer, const_pointer): New typedef. (unordered_map<>::reference, const_reference, difference_type): New typedef. (unordered_map<>::get_allocator, empty, size, max_size): Add usings. (unordered_map<>::bucket_count, max_bucket_count, bucket): Add usings. (unordered_map<>::hash_function, key_equal, count, contains): Add usings. (unordered_map<>::operator[], at, rehash, reserve): Add usings. (unordered_map<>::merge): New. (unordered_multimap<>::mapped_type, pointer, const_pointer): New typedef. (unordered_multimap<>::reference, const_reference, difference_type): New typedef. (unordered_multimap<>::get_allocator, empty, size, max_size): Add usings. (unordered_multimap<>::bucket_count, max_bucket_count, bucket): Add usings. (unordered_multimap<>::hash_function, key_equal, count, contains): Add usings. (unordered_multimap<>::rehash, reserve): Add usings. (unordered_multimap<>::merge): New. * include/debug/unordered_set (unordered_set<>::mapped_type, pointer, const_pointer): New typedef. (unordered_set<>::reference, const_reference, difference_type): New typedef. (unordered_set<>::get_allocator, empty, size, max_size): Add usings. (unordered_set<>::bucket_count, max_bucket_count, bucket): Add usings. (unordered_set<>::hash_function, key_equal, count, contains): Add usings. (unordered_set<>::rehash, reserve): Add usings. (unordered_set<>::merge): New. (unordered_multiset<>::mapped_type, pointer, const_pointer): New typedef. (unordered_multiset<>::reference, const_reference, difference_type): New typedef. (unordered_multiset<>::get_allocator, empty, size, max_size): Add usings. (unordered_multiset<>::bucket_count, max_bucket_count, bucket): Add usings. (unordered_multiset<>::hash_function, key_equal, count, contains): Add usings. (unordered_multiset<>::rehash, reserve): Add usings. (unordered_multiset<>::merge): New. * testsuite/23_containers/unordered_map/debug/merge1_neg.cc: New test. * testsuite/23_containers/unordered_map/debug/merge2_neg.cc: New test. * testsuite/23_containers/unordered_map/debug/merge3_neg.cc: New test. * testsuite/23_containers/unordered_map/debug/merge4_neg.cc: New test. * testsuite/23_containers/unordered_multimap/debug/merge1_neg.cc: New test. * testsuite/23_containers/unordered_multimap/debug/merge2_neg.cc: New test. * testsuite/23_containers/unordered_multimap/debug/merge3_neg.cc: New test. * testsuite/23_containers/unordered_multimap/debug/merge4_neg.cc: New test. * testsuite/23_containers/unordered_multiset/debug/merge1_neg.cc: New test. * testsuite/23_containers/unordered_multiset/debug/merge2_neg.cc: New test. * testsuite/23_containers/unordered_multiset/debug/merge3_neg.cc: New test. * testsuite/23_containers/unordered_multiset/debug/merge4_neg.cc: New test. * testsuite/23_containers/unordered_set/debug/merge1_neg.cc: New test. * testsuite/23_containers/unordered_set/debug/merge2_neg.cc: New test. * testsuite/23_containers/unordered_set/debug/merge3_neg.cc: New test. * testsuite/23_containers/unordered_set/debug/merge4_neg.cc: New test. * testsuite/util/testsuite_abi.h: [_GLIBCXX_DEBUG] Use normal unordered container implementation.
2021-11-09libstdc++: Make test print which random_device tokens workJonathan Wakely1-0/+7
libstdc++-v3/ChangeLog: * testsuite/26_numerics/random/random_device/cons/token.cc: Print results of random_device_available checks.
2021-11-09libstdc++: Support getentropy and arc4random in std::random_deviceJonathan Wakely2-0/+8
This adds additional "getentropy" and "arc4random" tokens to std::random_device. The former is supported on Glibc and OpenBSD (and apparently wasm), and the latter is supported on various BSDs. libstdc++-v3/ChangeLog: * acinclude.m4 (GLIBCXX_CHECK_GETENTROPY, GLIBCXX_CHECK_ARC4RANDOM): Define. * configure.ac (GLIBCXX_CHECK_GETENTROPY, GLIBCXX_CHECK_ARC4RANDOM): Use them. * config.h.in: Regenerate. * configure: Regenerate. * src/c++11/random.cc (random_device): Add getentropy and arc4random as sources. * testsuite/26_numerics/random/random_device/cons/token.cc: Check new tokens. * testsuite/26_numerics/random/random_device/entropy.cc: Likewise.
2021-11-09libstdc++: Make spurious std::random_device FAIL less likelyJonathan Wakely1-1/+1
It's possible that independent reads from /dev/random and /dev/urandom could produce the same value by chance. Retry if that happens. The chances of it happening twice are miniscule. libstdc++-v3/ChangeLog: * testsuite/26_numerics/random/random_device/cons/token.cc: Retry if random devices produce the same value.
2021-11-05libstdc++: Add support for POWER9 DARN instruction to std::random_deviceJonathan Wakely2-3/+4
The ISA-3.0 instruction set includes DARN ("deliver a random number") which can be used similarly to the existing support for RDRAND and RDSEED. libstdc++-v3/ChangeLog: * src/c++11/random.cc [__powerpc__] (USE_DARN): Define. (__ppc_darn): New function to use POWER9 DARN instruction. (Which): Add 'darn' enumerator. (which_source): Check for __ppc_darn. (random_device::_M_init): Support "darn" and "hw" tokens. (random_device::_M_getentropy): Add darn to switch. * testsuite/26_numerics/random/random_device/cons/token.cc: Check "darn" token. * testsuite/26_numerics/random/random_device/entropy.cc: Likewise.
2021-11-05libstdc++: Add xfail to pretty printer tests that fail in C++20Jonathan Wakely4-26/+45
For some reason the type printer for std::string doesn't work in C++20 mode, so std::basic_string<char, char_traits<char>, allocator<char> is printed out in full rather than being shown as std::string. It's probably related to the fact that the extern template declarations are disabled for C++20, but I don't know why that affects GDB. For now I'm just marking the relevant tests as XFAIL. That requires adding support for target selectors to individual GDB directives such as note-test and whatis-regexp-test. libstdc++-v3/ChangeLog: * testsuite/lib/gdb-test.exp: Add target selector support to the dg-final directives. * testsuite/libstdc++-prettyprinters/80276.cc: Add xfail for C++20. * testsuite/libstdc++-prettyprinters/libfundts.cc: Likewise. * testsuite/libstdc++-prettyprinters/prettyprinters.exp: Tweak comment.
2021-11-04libstdc++: Deprecate std::unexpected and handler functionsJonathan Wakely4-2/+4
These functions have been deprecated since C++11, and were removed in C++17. The proposal P0323 wants to reuse the name std::unexpected for a class template, so we will need to stop defining the current function for C++23 anyway. This marks them as deprecated for C++11 and up, to warn users they won't continue to be available. It disables them for C++17 and up, unless the _GLIBCXX_USE_DEPRECATED macro is defined. The <unwind-cxx.h> header uses std::unexpected_handler in the public API, but since that type is the same as std::terminate_handler we can just use that instead, to avoid warnings about it being deprecated. libstdc++-v3/ChangeLog: * doc/xml/manual/evolution.xml: Document deprecations. * doc/html/*: Regenerate. * libsupc++/exception (unexpected_handler, unexpected) (get_unexpected, set_unexpected): Add deprecated attribute. Do not define without _GLIBCXX_USE_DEPRECATED for C++17 and up. * libsupc++/eh_personality.cc (PERSONALITY_FUNCTION): Disable deprecated warnings. * libsupc++/eh_ptr.cc (std::rethrow_exception): Likewise. * libsupc++/eh_terminate.cc: Likewise. * libsupc++/eh_throw.cc (__cxa_init_primary_exception): Likewise. * libsupc++/unwind-cxx.h (struct __cxa_exception): Use terminate_handler instead of unexpected_handler. (struct __cxa_dependent_exception): Likewise. (__unexpected): Likewise. * testsuite/18_support/headers/exception/synopsis.cc: Add dg-warning for deprecated warning. * testsuite/18_support/exception_ptr/60612-unexpected.cc: Disable deprecated warnings. * testsuite/18_support/set_unexpected.cc: Likewise. * testsuite/18_support/unexpected_handler.cc: Likewise. gcc/testsuite/ChangeLog: * g++.dg/cpp0x/lambda/lambda-eh2.C: Add dg-warning for new deprecation warnings. * g++.dg/cpp0x/noexcept06.C: Likewise. * g++.dg/cpp0x/noexcept07.C: Likewise. * g++.dg/eh/forced3.C: Likewise. * g++.dg/eh/unexpected1.C: Likewise. * g++.old-deja/g++.eh/spec1.C: Likewise. * g++.old-deja/g++.eh/spec2.C: Likewise. * g++.old-deja/g++.eh/spec3.C: Likewise. * g++.old-deja/g++.eh/spec4.C: Likewise. * g++.old-deja/g++.mike/eh33.C: Likewise. * g++.old-deja/g++.mike/eh34.C: Likewise. * g++.old-deja/g++.mike/eh50.C: Likewise. * g++.old-deja/g++.mike/eh51.C: Likewise.
2021-11-04libstdc++: Optimize std::tuple_element and std::tuple_size_vJonathan Wakely1-0/+1
This reduces the number of class template instantiations needed for code using tuples, by reusing _Nth_type in tuple_element and specializing tuple_size_v for tuple, pair and array (and const-qualified versions of them). Also define the _Nth_type primary template as a complete type (but with no nested 'type' member). This avoids "invalid use of incomplete type" errors for out-of-range specializations of tuple_element. Those errors would probably be confusing and unhelpful for users. We already have a user-friendly static assert in tuple_element itself. Also ensure that tuple_size_v is available whenever tuple_size is (as proposed by LWG 3387). We already do that for tuple_element_t. libstdc++-v3/ChangeLog: * include/bits/stl_pair.h (tuple_size_v): Define partial specializations for std::pair. * include/bits/utility.h (_Nth_type): Move definition here and define primary template. (tuple_size_v): Move definition here. * include/std/array (tuple_size_v): Define partial specializations for std::array. * include/std/tuple (tuple_size_v): Move primary template to <bits/utility.h>. Define partial specializations for std::tuple. (tuple_element): Change definition to use _Nth_type. * include/std/variant (_Nth_type): Move to <bits/utility.h>. (variant_alternative, variant): Adjust qualification of _Nth_type. * testsuite/20_util/tuple/element_access/get_neg.cc: Prune additional errors from _Nth_type.
2021-11-04libstdc++: Fix handling of const types in std::variant [PR102912]Jonathan Wakely1-0/+71
Prior to r12-4447 (implementing P2231R1 constexpr changes) we didn't construct the correct member of the union in __variant_construct_single, we just plopped an object in the memory occupied by the union: void* __storage = std::addressof(__lhs._M_u); using _Type = remove_reference_t<decltype(__rhs_mem)>; ::new (__storage) _Type(std::forward<decltype(__rhs_mem)>(__rhs_mem)); We didn't care whether we had variant<int, const int>, we would just place an int (or const int) into the storage, and then set the _M_index to say which one it was. In the new constexpr-friendly code we use std::construct_at to construct the union object, which constructs the active member of the right type. But now we need to know exactly the right type. We have to distinguish between alternatives of type int and const int, and we have to be able to find a const int (or const std::string, as in the OP) among the alternatives. So my change from remove_reference_t<decltype(__rhs_mem)> to remove_cvref_t<_Up> was wrong. It strips the const from const int, and then we can't find the index of the const int alternative. But just using remove_reference_t doesn't work either. When the copy assignment operator of std::variant<int> uses __variant_construct_single it passes a const int& as __rhs_mem, but if we don't strip the const then we try to find const int among the alternatives, and *that* fails. Similarly for the copy constructor, which also uses a const int& as the initializer for a non-const int alternative. The root cause of the problem is that __variant_construct_single doesn't know the index of the type it's supposed to construct, and the new _Variant_storage::__index_of<_Type> helper doesn't work if __rhs_mem and the alternative being constructed have different const-qualification. We need to replace __variant_construct_single with something that knows the index of the alternative being constructed. All uses of that function do actually know the index, but that context is lost by the time we call __variant_construct_single. This patch replaces that function and __variant_construct, inlining their effects directly into the callers. libstdc++-v3/ChangeLog: PR libstdc++/102912 * include/std/variant (_Variant_storage::__index_of): Remove. (__variant_construct_single): Remove. (__variant_construct): Remove. (_Copy_ctor_base::_Copy_ctor_base(const _Copy_ctor_base&)): Do construction directly instead of using __variant_construct. (_Move_ctor_base::_Move_ctor_base(_Move_ctor_base&&)): Likewise. (_Move_ctor_base::_M_destructive_move()): Remove. (_Move_ctor_base::_M_destructive_copy()): Remove. (_Copy_assign_base::operator=(const _Copy_assign_base&)): Do construction directly instead of using _M_destructive_copy. (variant::swap): Do construction directly instead of using _M_destructive_move. * testsuite/20_util/variant/102912.cc: New test.
2021-11-03libstdc++: Fix regression in std::list::sort [PR66742]Jonathan Wakely1-0/+23
The standard does not require const-correct comparisons in list::sort. libstdc++-v3/ChangeLog: PR libstdc++/66742 * include/bits/list.tcc (list::sort): Use mutable iterators for comparisons. * include/bits/stl_list.h (_Scratch_list::_Ptr_cmp): Likewise. * testsuite/23_containers/list/operations/66742.cc: Check non-const comparisons.
2021-11-01libstdc++: Missing constexpr for __gnu_debug::__valid_range etcJonathan Wakely1-0/+11
The new 25_algorithms/move/constexpr.cc test fails in debug mode, because the debug assertions use the non-constexpr overloads in <debug/stl_iterator.h>. libstdc++-v3/ChangeLog: * include/debug/stl_iterator.h (__valid_range): Add constexpr for C++20. Qualify call to avoid ADL. (__get_distance, __can_advance, __unsafe, __base): Likewise. * testsuite/25_algorithms/move/constexpr.cc: Also check with std::reverse_iterator arguments.
2021-11-01libstdc++: Fix range access for empty std::valarray [PR103022]Jonathan Wakely3-8/+78
The std::begin and std::end overloads for std::valarray are defined in terms of std::addressof(v[0]) which is undefined for an empty valarray. libstdc++-v3/ChangeLog: PR libstdc++/103022 * include/std/valarray (begin, end): Do not dereference an empty valarray. Add noexcept and [[nodiscard]]. * testsuite/26_numerics/valarray/range_access.cc: Check empty valarray. Check iterator properties. Run as well as compiling. * testsuite/26_numerics/valarray/range_access2.cc: Likewise. * testsuite/26_numerics/valarray/103022.cc: New test.
2021-10-29libstdc++: Fix typo in std::stack testJonathan Wakely1-1/+1
libstdc++-v3/ChangeLog: * testsuite/23_containers/stack/deduction.cc: Fix typo.
2021-10-26Make full use of context-sensitive ranges in access warnings.Martin Sebor2-2/+3
gcc/ChangeLog: * builtins.c (check_strncat_sizes): Pass access_data ctor additional arguments. (expand_builtin_memcmp): Move code to gimple-ssa-warn-access.cc. (expand_builtin_fork_or_exec): Same. * gimple-array-bounds.cc (array_bounds_checker::check_mem_ref): Pass compute_objsize additional arguments. (inbounds_memaccess_p): Same. (array_bounds_checker::check_array_bounds): Add an assert. Stash statement in a member. (check_array_bounds_dom_walker::before_dom_children): Same. * gimple-array-bounds.h (array_bounds_checker::m_stmt): New member. * gimple-ssa-sprintf.c (get_destination_size): Add an argument. (handle_printf_call): Pass a new argument. * gimple-ssa-warn-access.cc (get_size_range): Add an argument. (check_access): Add an argument and pass it along to callees. (check_read_access): Make a member function. (pass_waccess::check_strcat): Pass access_data ctor additional arguments. (pass_waccess::check_strncat): Same. (pass_waccess::check_stxcpy): Same. (pass_waccess::check_stxncpy): Same. (pass_waccess::check_strncmp): Same. (pass_waccess::check_read_access): Same. (pass_waccess::check_builtin): Same. (pass_waccess::maybe_check_access_sizes): Same. (pass_waccess::maybe_check_dealloc_call): Same. * gimple-ssa-warn-access.h (check_read_access): Declare a new member function. * pointer-query.cc (compute_objsize_r): Add an argument. (gimple_call_return_array): Same. (gimple_call_alloc_size): Same. (access_ref::access_ref): Same. (access_ref::get_ref): Same. (pointer_query::get_ref): Same. (handle_min_max_size): Pass an arguments to callees. (handle_array_ref): Add an argument. (handle_mem_ref): Same. (compute_objsize): Same. * pointer-query.h (struct access_ref): Adjust signatures. (struct access_data): Same. (gimple_call_alloc_size): Add an argument. (gimple_parm_array_size): Same. (compute_objsize): Same. * tree-ssa-strlen.c (strlen_pass::adjust_last_stmt): Pass an additional argument to compute_objsize. (strlen_pass::maybe_warn_overflow): Same. (maybe_diag_stxncpy_trunc): Same. gcc/testsuite/ChangeLog: * gcc.dg/Wstringop-overflow-22.c: Correct typos. * gcc.dg/Wstringop-overflow-81.c: New test. libstdc++-v3/ChangeLog: * testsuite/21_strings/basic_string/capacity/1.cc: Also suppress -Wstringop-overread. * testsuite/27_io/filesystem/path/factory/u8path-char8_t.cc: Same.
2021-10-26libstdc++: Fix 28_regex/basic_regex/84110.cc on SolarisRainer Orth1-0/+3
28_regex/basic_regex/84110.cc currently FAILs on Solaris: FAIL: 28_regex/basic_regex/84110.cc (test for excess errors) UNRESOLVED: 28_regex/basic_regex/84110.cc compilation failed to produce executable Excess errors: /vol/gcc/src/hg/master/local/libstdc++-v3/testsuite/28_regex/basic_regex/84110.cc:14: error: reference to 'extended' is ambiguous The issue is seen in the full output: /vol/gcc/src/hg/master/local/libstdc++-v3/testsuite/28_regex/basic_regex/84110.cc: In function ‘void test01()’: /vol/gcc/src/hg/master/local/libstdc++-v3/testsuite/28_regex/basic_regex/84110.cc:14: error: reference to ‘extended’ is ambiguous In file included from /var/gcc/regression/master/11.4-gcc-gas/build/gcc/include-fixed/math.h:391, from /var/gcc/regression/master/11.4-gcc-gas/build/i386-pc-solaris2.11/libstdc++-v3/include/cmath:45, from /vol/gcc/src/hg/master/local/libstdc++-v3/include/precompiled/stdc++.h:41: /usr/include/floatingpoint.h:73: note: candidates are: ‘typedef unsigned int extended [3]’ Fixed by disambiguating extended. Tested on i386-pc-solaris2.11, sparc-sun-solaris2.11, and x86_64-pc-linux-gnu. 2021-10-20 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE> libstdc++-v3: * testsuite/28_regex/basic_regex/84110.cc (test01) [__cpp_exceptions]: Disambiguate extended.
2021-10-26libstdc++: Fix 17_intro/names.cc on SolarisRainer Orth1-0/+4
17_intro/names.cc and experimental/names.cc currently FAIL on Solaris FAIL: 17_intro/names.cc (test for excess errors) FAIL: experimental/names.cc (test for excess errors) Excess errors: /usr/include/sys/timespec_util.h:22: error: expected ')' before ';' token /usr/include/stdlib.h:157: error: expected unqualified-id before '[' token /usr/include/stdlib.h:157: error: expected ')' before '[' token <sys/timespec_util.h> has extern int timespeccompare(const struct timespec *l, const struct timespec *r); while <stdlib.h> has typedef struct drand48_data { unsigned int _initialised; unsigned short int x[3]; unsigned short int a[3]; unsigned int c; unsigned short lastx[3]; } drand48_data; both of which are broken by defining r resp. x to ( in the testcase. Fixed by undoing the defines. Tested on i386-pc-solaris2.11, sparc-sun-solaris2.11, and x86_64-pc-linux-gnu. 2021-10-20 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE> libstdc++-v3: * testsuite/17_intro/names.cc [__sun__] (r, x): Undef.
2021-10-22libstdc++: Constrain std::make_any [PR102894]Jonathan Wakely1-0/+20
std::make_any should be constrained so it can only be called if the construction of the return value would be valid. libstdc++-v3/ChangeLog: PR libstdc++/102894 * include/std/any (make_any): Add SFINAE constraint. * testsuite/20_util/any/102894.cc: New test.