https://gcc.gnu.org/g:fd1a674ff5f37e74fbbdcdb85d78399e963eb401
commit r15-782-gfd1a674ff5f37e74fbbdcdb85d78399e963eb401 Author: Jonathan Wakely <jwak...@redhat.com> Date: Wed May 22 18:38:36 2024 +0100 libstdc++: Add [[nodiscard]] to some std::locale functions libstdc++-v3/ChangeLog: * include/bits/locale_classes.h (locale::combine) (locale::name, locale::operator==, locale::operator!=) (locale::operator(), locale::classic): Add nodiscard attribute. * include/bits/locale_classes.tcc (has_facet, use_facet): Likewise. * testsuite/22_locale/locale/cons/12438.cc: Add dg-warning for nodiscard diagnostic. * testsuite/22_locale/locale/cons/2.cc: Cast use_facet expression to void, to suppress diagnostic. * testsuite/22_locale/locale/cons/unicode.cc: Likewise. * testsuite/22_locale/locale/operations/2.cc: Add dg-warning. Diff: --- libstdc++-v3/include/bits/locale_classes.h | 7 ++++++- libstdc++-v3/include/bits/locale_classes.tcc | 2 ++ libstdc++-v3/testsuite/22_locale/locale/cons/12438.cc | 2 +- libstdc++-v3/testsuite/22_locale/locale/cons/2.cc | 2 +- libstdc++-v3/testsuite/22_locale/locale/cons/unicode.cc | 2 +- libstdc++-v3/testsuite/22_locale/locale/operations/2.cc | 2 +- 6 files changed, 12 insertions(+), 5 deletions(-) diff --git a/libstdc++-v3/include/bits/locale_classes.h b/libstdc++-v3/include/bits/locale_classes.h index a2e94217006..50a748066f1 100644 --- a/libstdc++-v3/include/bits/locale_classes.h +++ b/libstdc++-v3/include/bits/locale_classes.h @@ -240,6 +240,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION * @throw std::runtime_error if __other has no facet of type _Facet. */ template<typename _Facet> + _GLIBCXX_NODISCARD locale combine(const locale& __other) const; @@ -248,7 +249,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION * @brief Return locale name. * @return Locale name or "*" if unnamed. */ - _GLIBCXX_DEFAULT_ABI_TAG + _GLIBCXX_NODISCARD _GLIBCXX_DEFAULT_ABI_TAG string name() const; @@ -269,6 +270,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION * @return True if other and this refer to the same locale instance, are * copies, or have the same name. False otherwise. */ + _GLIBCXX_NODISCARD bool operator==(const locale& __other) const throw(); @@ -279,6 +281,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION * @param __other The locale to compare against. * @return ! (*this == __other) */ + _GLIBCXX_NODISCARD bool operator!=(const locale& __other) const throw() { return !(this->operator==(__other)); } @@ -300,6 +303,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION * @return True if collate<_Char> facet compares __s1 < __s2, else false. */ template<typename _Char, typename _Traits, typename _Alloc> + _GLIBCXX_NODISCARD bool operator()(const basic_string<_Char, _Traits, _Alloc>& __s1, const basic_string<_Char, _Traits, _Alloc>& __s2) const; @@ -321,6 +325,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION /** * @brief Return reference to the C locale. */ + _GLIBCXX_NODISCARD static const locale& classic(); diff --git a/libstdc++-v3/include/bits/locale_classes.tcc b/libstdc++-v3/include/bits/locale_classes.tcc index 00eeb7dd9f8..c79574e58de 100644 --- a/libstdc++-v3/include/bits/locale_classes.tcc +++ b/libstdc++-v3/include/bits/locale_classes.tcc @@ -173,6 +173,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION * @return true if @p __loc contains a facet of type _Facet, else false. */ template<typename _Facet> + _GLIBCXX_NODISCARD inline bool has_facet(const locale& __loc) _GLIBCXX_USE_NOEXCEPT { @@ -202,6 +203,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wdangling-reference" template<typename _Facet> + _GLIBCXX_NODISCARD inline const _Facet& use_facet(const locale& __loc) { diff --git a/libstdc++-v3/testsuite/22_locale/locale/cons/12438.cc b/libstdc++-v3/testsuite/22_locale/locale/cons/12438.cc index 7ff3a487745..4838e1ba693 100644 --- a/libstdc++-v3/testsuite/22_locale/locale/cons/12438.cc +++ b/libstdc++-v3/testsuite/22_locale/locale/cons/12438.cc @@ -45,7 +45,7 @@ void test01(int iters) locale loc2 = locale(""); VERIFY( !has_facet<MyFacet>(loc2) ); - loc1.combine<MyFacet>(loc2); + loc1.combine<MyFacet>(loc2); // { dg-warning "nodiscard" "" { target c++17 } } VERIFY( false ); } catch (std::runtime_error&) diff --git a/libstdc++-v3/testsuite/22_locale/locale/cons/2.cc b/libstdc++-v3/testsuite/22_locale/locale/cons/2.cc index 12478dbfdc2..dce150effea 100644 --- a/libstdc++-v3/testsuite/22_locale/locale/cons/2.cc +++ b/libstdc++-v3/testsuite/22_locale/locale/cons/2.cc @@ -68,7 +68,7 @@ void test01() { VERIFY( false ); } try - { use_facet<gnu_facet>(loc02); } + { (void) use_facet<gnu_facet>(loc02); } catch(bad_cast& obj) { VERIFY( true ); } catch(...) diff --git a/libstdc++-v3/testsuite/22_locale/locale/cons/unicode.cc b/libstdc++-v3/testsuite/22_locale/locale/cons/unicode.cc index 24af4142cd9..98d744de91e 100644 --- a/libstdc++-v3/testsuite/22_locale/locale/cons/unicode.cc +++ b/libstdc++-v3/testsuite/22_locale/locale/cons/unicode.cc @@ -79,7 +79,7 @@ void test01() { VERIFY( false ); } try - { use_facet<gnu_facet>(loc13); } + { (void) use_facet<gnu_facet>(loc13); } catch(bad_cast& obj) { VERIFY( true ); } catch(...) diff --git a/libstdc++-v3/testsuite/22_locale/locale/operations/2.cc b/libstdc++-v3/testsuite/22_locale/locale/operations/2.cc index 899535137ba..917adecac56 100644 --- a/libstdc++-v3/testsuite/22_locale/locale/operations/2.cc +++ b/libstdc++-v3/testsuite/22_locale/locale/operations/2.cc @@ -48,7 +48,7 @@ void test02() // Derivation, MF check. locale loc_gnu(loc_c, new gnu_collate); gnu_count = 0; - loc_gnu(s01, s02); + loc_gnu(s01, s02); // { dg-warning "nodiscard" "" { target c++17 } } VERIFY( gnu_count == 1 ); }