From d69f1ec7d19f3770450a6215395073dd911e5d20 Mon Sep 17 00:00:00 2001 From: Jonathan Wakely Date: Thu, 23 Nov 2017 22:11:21 +0000 Subject: [PATCH] Add [[nodiscard]] attribute to C++17 components * include/bits/fs_path.h (path::empty): Add nodiscard attribute. * include/bits/range_access.h (empty): Likewise. * include/std/string_view (basic_string_view::empty): Likewise. * testsuite/21_strings/basic_string_view/capacity/empty_neg.cc: New test. * testsuite/24_iterators/range_access_cpp17_neg.cc: New test. * testsuite/27_io/filesystem/path/query/empty_neg.cc: New test. From-SVN: r255124 --- libstdc++-v3/ChangeLog | 8 ++++ libstdc++-v3/include/bits/fs_path.h | 2 +- libstdc++-v3/include/bits/node_handle.h | 2 +- libstdc++-v3/include/bits/range_access.h | 6 +-- libstdc++-v3/include/std/string_view | 2 +- .../basic_string_view/capacity/empty_neg.cc | 28 ++++++++++++ .../24_iterators/range_access_cpp17_neg.cc | 44 +++++++++++++++++++ .../27_io/filesystem/path/query/empty_neg.cc | 28 ++++++++++++ 8 files changed, 114 insertions(+), 6 deletions(-) create mode 100644 libstdc++-v3/testsuite/21_strings/basic_string_view/capacity/empty_neg.cc create mode 100644 libstdc++-v3/testsuite/24_iterators/range_access_cpp17_neg.cc create mode 100644 libstdc++-v3/testsuite/27_io/filesystem/path/query/empty_neg.cc diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 099881afad1..3b2dad016fd 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,5 +1,13 @@ 2017-11-23 Jonathan Wakely + * include/bits/fs_path.h (path::empty): Add nodiscard attribute. + * include/bits/range_access.h (empty): Likewise. + * include/std/string_view (basic_string_view::empty): Likewise. + * testsuite/21_strings/basic_string_view/capacity/empty_neg.cc: New + test. + * testsuite/24_iterators/range_access_cpp17_neg.cc: New test. + * testsuite/27_io/filesystem/path/query/empty_neg.cc: New test. + PR libstdc++/83134 * include/std/type_traits (__not_): Explicitly convert to bool. * testsuite/20_util/declval/requirements/1_neg.cc: Adjust dg-error. diff --git a/libstdc++-v3/include/bits/fs_path.h b/libstdc++-v3/include/bits/fs_path.h index 7d97cdfbb81..99740c9b383 100644 --- a/libstdc++-v3/include/bits/fs_path.h +++ b/libstdc++-v3/include/bits/fs_path.h @@ -370,7 +370,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CXX11 // query - bool empty() const noexcept { return _M_pathname.empty(); } + [[nodiscard]] bool empty() const noexcept { return _M_pathname.empty(); } bool has_root_name() const; bool has_root_directory() const; bool has_root_path() const; diff --git a/libstdc++-v3/include/bits/node_handle.h b/libstdc++-v3/include/bits/node_handle.h index 4a830630c89..0d8dbeb4110 100644 --- a/libstdc++-v3/include/bits/node_handle.h +++ b/libstdc++-v3/include/bits/node_handle.h @@ -62,7 +62,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION explicit operator bool() const noexcept { return _M_ptr != nullptr; } - bool empty() const noexcept { return _M_ptr == nullptr; } + [[nodiscard]] bool empty() const noexcept { return _M_ptr == nullptr; } protected: constexpr _Node_handle_common() noexcept : _M_ptr(), _M_alloc() {} diff --git a/libstdc++-v3/include/bits/range_access.h b/libstdc++-v3/include/bits/range_access.h index 2a037ad8082..a5044f11976 100644 --- a/libstdc++-v3/include/bits/range_access.h +++ b/libstdc++-v3/include/bits/range_access.h @@ -257,7 +257,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION * @param __cont Container. */ template - constexpr auto + [[nodiscard]] constexpr auto empty(const _Container& __cont) noexcept(noexcept(__cont.empty())) -> decltype(__cont.empty()) { return __cont.empty(); } @@ -267,7 +267,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION * @param __array Container. */ template - constexpr bool + [[nodiscard]] constexpr bool empty(const _Tp (&/*__array*/)[_Nm]) noexcept { return false; } @@ -276,7 +276,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION * @param __il Initializer list. */ template - constexpr bool + [[nodiscard]] constexpr bool empty(initializer_list<_Tp> __il) noexcept { return __il.size() == 0;} diff --git a/libstdc++-v3/include/std/string_view b/libstdc++-v3/include/std/string_view index 1900b867841..fa834002726 100644 --- a/libstdc++-v3/include/std/string_view +++ b/libstdc++-v3/include/std/string_view @@ -160,7 +160,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION / sizeof(value_type) / 4; } - constexpr bool + [[nodiscard]] constexpr bool empty() const noexcept { return this->_M_len == 0; } diff --git a/libstdc++-v3/testsuite/21_strings/basic_string_view/capacity/empty_neg.cc b/libstdc++-v3/testsuite/21_strings/basic_string_view/capacity/empty_neg.cc new file mode 100644 index 00000000000..59c87d007d8 --- /dev/null +++ b/libstdc++-v3/testsuite/21_strings/basic_string_view/capacity/empty_neg.cc @@ -0,0 +1,28 @@ +// Copyright (C) 2017 Free Software Foundation, Inc. +// +// This file is part of the GNU ISO C++ Library. This library is free +// software; you can redistribute it and/or modify it under the +// terms of the GNU General Public License as published by the +// Free Software Foundation; either version 3, or (at your option) +// any later version. + +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License along +// with this library; see the file COPYING3. If not see +// . + +// { dg-options "-std=gnu++17" } +// { dg-do compile { target c++17 } } + +#include + +void +test01() +{ + std::string_view s; + s.empty(); // { dg-warning "ignoring return value" } +} diff --git a/libstdc++-v3/testsuite/24_iterators/range_access_cpp17_neg.cc b/libstdc++-v3/testsuite/24_iterators/range_access_cpp17_neg.cc new file mode 100644 index 00000000000..12de34eb6e4 --- /dev/null +++ b/libstdc++-v3/testsuite/24_iterators/range_access_cpp17_neg.cc @@ -0,0 +1,44 @@ +// Copyright (C) 2017 Free Software Foundation, Inc. +// +// This file is part of the GNU ISO C++ Library. This library is free +// software; you can redistribute it and/or modify it under the +// terms of the GNU General Public License as published by the +// Free Software Foundation; either version 3, or (at your option) +// any later version. + +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License along +// with this library; see the file COPYING3. If not see +// . + +// { dg-options "-std=gnu++17" } +// { dg-do compile { target c++17 } } + +#include +#include + +void +test01() +{ + struct A { bool empty() const { return true; } }; + A a; + std::empty(a); // { dg-warning "ignoring return value" } +} + +void +test02() +{ + int a[2]; + std::empty(a); // { dg-warning "ignoring return value" } +} + +void +test03() +{ + std::initializer_list a{}; + std::empty(a); // { dg-warning "ignoring return value" } +} diff --git a/libstdc++-v3/testsuite/27_io/filesystem/path/query/empty_neg.cc b/libstdc++-v3/testsuite/27_io/filesystem/path/query/empty_neg.cc new file mode 100644 index 00000000000..7d38b494e9e --- /dev/null +++ b/libstdc++-v3/testsuite/27_io/filesystem/path/query/empty_neg.cc @@ -0,0 +1,28 @@ +// Copyright (C) 2017 Free Software Foundation, Inc. +// +// This file is part of the GNU ISO C++ Library. This library is free +// software; you can redistribute it and/or modify it under the +// terms of the GNU General Public License as published by the +// Free Software Foundation; either version 3, or (at your option) +// any later version. + +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License along +// with this library; see the file COPYING3. If not see +// . + +// { dg-options "-std=gnu++17" } +// { dg-do compile { target c++17 } } + +#include + +void +test01() +{ + std::filesystem::path p; + p.empty(); // { dg-warning "ignoring return value" } +} -- 2.30.2