* [PATCH] Complete __gnu_test::basic_string<>::compare support
@ 2022-08-10 18:31 François Dumont
2022-10-12 11:20 ` Jonathan Wakely
0 siblings, 1 reply; 2+ messages in thread
From: François Dumont @ 2022-08-10 18:31 UTC (permalink / raw)
To: libstdc++; +Cc: gcc-patches
[-- Attachment #1: Type: text/plain, Size: 2845 bytes --]
Here is another patch to complete __gnu_debug::basic_string<> Standard
conformity. This one is adding the missing compare overloads.
I also would like to propose to change how __gnu_debug::basic_string<>
is tested. I considered activating <bits/basic_string.h> checks when
_GLIBCXX_ASSERTIONS is defined but it turns out that to do so this
light-debug mode should then also consider _GLIBCXX_DEBUG_PEDANTIC. I
prefer to avoid this.
So I restored previous behavior. I'm now checking for the
_GLIBCXX_TEST_DEBUG_STRING macro to force usage of <debug/string>. This
way I am testing it using:
make check-debug CXXFLAGS=-D_GLIBCXX_TEST_DEBUG_STRING
libstdc++: Add __gnu_debug::basic_string<>::compare overloads
Rather than adding those implementations we are ading a:
using _Base::compare;
so that any compare method not implemented at __gnu_debug::basic_string
level are injected from the base class.
Also review how __gnu_debug::basic_string is tested. Now require to
define
_GLIBCXX_TEST_DEBUG_STRING when running 'make check-debug'.
libstdc++-v3/ChangeLog
* include/debug/string: Add using _Base::compare.
(__gnu_debug::basic_string<>::compare(const
basic_string<>&)): Remove.
(__gnu_debug::basic_string<>::compare(size_type, size_type,
const basic_string<>&)):
Remove.
(__gnu_debug::basic_string<>::compare(size_type, size_type,
const basic_string<>&,
size_type, size_type)): Remove.
* testsuite/util/testsuite_string.h
[_GLIBCXX_TEST_DEBUG_STRING]: Include <debug/string>.
*
testsuite/21_strings/basic_string/operations/compare/char/1.cc: Include
testsuite_string.h
and use __gnu_test::string.
*
testsuite/21_strings/basic_string/operations/compare/char/13650.cc:
Likewise.
*
testsuite/21_strings/basic_string/operations/compare/char/2.cc: Likewise.
*
testsuite/21_strings/basic_string/operations/rfind/char/1.cc: Likewise.
*
testsuite/21_strings/basic_string/operations/rfind/char/2.cc: Likewise.
*
testsuite/21_strings/basic_string/operations/rfind/char/3.cc: Likewise.
*
testsuite/21_strings/basic_string/operations/compare/wchar_t/1.cc:
Include testsuite_string.h
and use __gnu_test::wstring.
*
testsuite/21_strings/basic_string/operations/compare/wchar_t/13650.cc:
Likewise.
*
testsuite/21_strings/basic_string/operations/compare/wchar_t/2.cc: Likewise.
Tested under Linux x86_64.
Ok to commit ?
François
[-- Attachment #2: debug_string.patch --]
[-- Type: text/x-patch, Size: 11190 bytes --]
diff --git a/libstdc++-v3/include/debug/string b/libstdc++-v3/include/debug/string
index a4482db4af5..c32eb41eacd 100644
--- a/libstdc++-v3/include/debug/string
+++ b/libstdc++-v3/include/debug/string
@@ -1002,22 +1002,11 @@ namespace __gnu_debug
substr(size_type __pos = 0, size_type __n = _Base::npos) const
{ return basic_string(_Base::substr(__pos, __n)); }
- int
- compare(const basic_string& __str) const
- { return _Base::compare(__str); }
-
- int
- compare(size_type __pos1, size_type __n1,
- const basic_string& __str) const
- { return _Base::compare(__pos1, __n1, __str); }
-
- int
- compare(size_type __pos1, size_type __n1, const basic_string& __str,
- size_type __pos2, size_type __n2) const
- { return _Base::compare(__pos1, __n1, __str, __pos2, __n2); }
+ using _Base::compare;
+ _GLIBCXX20_CONSTEXPR
int
- compare(const _CharT* __s) const
+ compare(const _CharT* __s) const _GLIBCXX_NOEXCEPT
{
__glibcxx_check_string(__s);
return _Base::compare(__s);
@@ -1025,6 +1014,7 @@ namespace __gnu_debug
// _GLIBCXX_RESOLVE_LIB_DEFECTS
// 5. string::compare specification questionable
+ _GLIBCXX20_CONSTEXPR
int
compare(size_type __pos1, size_type __n1, const _CharT* __s) const
{
@@ -1034,6 +1024,7 @@ namespace __gnu_debug
// _GLIBCXX_RESOLVE_LIB_DEFECTS
// 5. string::compare specification questionable
+ _GLIBCXX20_CONSTEXPR
int
compare(size_type __pos1, size_type __n1,const _CharT* __s,
size_type __n2) const
diff --git a/libstdc++-v3/testsuite/21_strings/basic_string/operations/compare/char/1.cc b/libstdc++-v3/testsuite/21_strings/basic_string/operations/compare/char/1.cc
index 0bef0d2dd3d..c04b83c4896 100644
--- a/libstdc++-v3/testsuite/21_strings/basic_string/operations/compare/char/1.cc
+++ b/libstdc++-v3/testsuite/21_strings/basic_string/operations/compare/char/1.cc
@@ -29,7 +29,7 @@
// NB compare should be thought of as a lexographical compare, ie how
// things would be sorted in a dictionary.
-#include <string>
+#include <testsuite_string.h>
#include <cstring>
#include <testsuite_hooks.h>
@@ -67,7 +67,7 @@ test_value(int result, want_value expected)
int
test01()
{
- using namespace std;
+ using namespace __gnu_test;
string str_0("costa rica");
string str_1("costa marbella");
diff --git a/libstdc++-v3/testsuite/21_strings/basic_string/operations/compare/char/13650.cc b/libstdc++-v3/testsuite/21_strings/basic_string/operations/compare/char/13650.cc
index 96fd2f14b33..ce956235f83 100644
--- a/libstdc++-v3/testsuite/21_strings/basic_string/operations/compare/char/13650.cc
+++ b/libstdc++-v3/testsuite/21_strings/basic_string/operations/compare/char/13650.cc
@@ -19,13 +19,13 @@
// 21.3.6.8 basic_string::compare [lib.string::compare]
-#include <string>
+#include <testsuite_string.h>
#include <testsuite_hooks.h>
// libstdc++/13650
void test01()
{
- using namespace std;
+ using namespace __gnu_test;
const char lit_01[] = { 'w', 'e', '\0', 'r', 'd' };
const char lit_02[] = { 'w', 'e', 'i', '\0', 'd' };
diff --git a/libstdc++-v3/testsuite/21_strings/basic_string/operations/compare/char/2.cc b/libstdc++-v3/testsuite/21_strings/basic_string/operations/compare/char/2.cc
index 17e87526c26..fca154355ff 100644
--- a/libstdc++-v3/testsuite/21_strings/basic_string/operations/compare/char/2.cc
+++ b/libstdc++-v3/testsuite/21_strings/basic_string/operations/compare/char/2.cc
@@ -19,14 +19,14 @@
// [string::compare]
-#include <string>
+#include <testsuite_string.h>
#include <testsuite_hooks.h>
void
test03()
{
std::string_view str1("foobar");
- std::string str2("foobar");
+ __gnu_test::string str2("foobar");
auto x = str2.compare(str1);
VERIFY (x == 0);
@@ -52,7 +52,7 @@ test03()
void
test04()
{
- const std::string str("a");
+ const __gnu_test::string str("a");
char c = 'a';
int res = str.compare(0, 1, &c, 1);
VERIFY ( !res );
diff --git a/libstdc++-v3/testsuite/21_strings/basic_string/operations/compare/wchar_t/1.cc b/libstdc++-v3/testsuite/21_strings/basic_string/operations/compare/wchar_t/1.cc
index 97a873a55cf..aa5c1680045 100644
--- a/libstdc++-v3/testsuite/21_strings/basic_string/operations/compare/wchar_t/1.cc
+++ b/libstdc++-v3/testsuite/21_strings/basic_string/operations/compare/wchar_t/1.cc
@@ -29,7 +29,7 @@
// NB compare should be thought of as a lexographical compare, ie how
// things would be sorted in a dictionary.
-#include <string>
+#include <testsuite_string.h>
#include <testsuite_hooks.h>
enum want_value {lt=0, z=1, gt=2};
@@ -67,7 +67,7 @@ test_value(int result, want_value expected)
int
test01()
{
- using namespace std;
+ using namespace __gnu_test;
wstring str_0(L"costa rica");
wstring str_1(L"costa marbella");
diff --git a/libstdc++-v3/testsuite/21_strings/basic_string/operations/compare/wchar_t/13650.cc b/libstdc++-v3/testsuite/21_strings/basic_string/operations/compare/wchar_t/13650.cc
index 1825c6b3b30..f3dd4ebaf43 100644
--- a/libstdc++-v3/testsuite/21_strings/basic_string/operations/compare/wchar_t/13650.cc
+++ b/libstdc++-v3/testsuite/21_strings/basic_string/operations/compare/wchar_t/13650.cc
@@ -19,13 +19,13 @@
// 21.3.6.8 basic_string::compare [lib.string::compare]
-#include <string>
+#include <testsuite_string.h>
#include <testsuite_hooks.h>
// libstdc++/13650
void test01()
{
- using namespace std;
+ using namespace __gnu_test;
const wchar_t lit_01[] = { L'w', L'e', L'\0', L'r', L'd' };
const wchar_t lit_02[] = { L'w', L'e', L'i', L'\0', L'd' };
diff --git a/libstdc++-v3/testsuite/21_strings/basic_string/operations/compare/wchar_t/2.cc b/libstdc++-v3/testsuite/21_strings/basic_string/operations/compare/wchar_t/2.cc
index dd703c19868..c6d219a42ec 100644
--- a/libstdc++-v3/testsuite/21_strings/basic_string/operations/compare/wchar_t/2.cc
+++ b/libstdc++-v3/testsuite/21_strings/basic_string/operations/compare/wchar_t/2.cc
@@ -19,14 +19,14 @@
// [string::compare]
-#include <string>
+#include <testsuite_string.h>
#include <testsuite_hooks.h>
void
test03()
{
std::wstring_view str1(L"foobar");
- std::wstring str2(L"foobar");
+ __gnu_test::wstring str2(L"foobar");
auto x = str2.compare(str1);
VERIFY (x == 0);
@@ -52,7 +52,7 @@ test03()
void
test04()
{
- const std::wstring str(L"a");
+ const __gnu_test::wstring str(L"a");
wchar_t c = L'a';
int res = str.compare(0, 1, &c, 1);
diff --git a/libstdc++-v3/testsuite/21_strings/basic_string/operations/rfind/char/1.cc b/libstdc++-v3/testsuite/21_strings/basic_string/operations/rfind/char/1.cc
index 73843b03a9a..76fcb079117 100644
--- a/libstdc++-v3/testsuite/21_strings/basic_string/operations/rfind/char/1.cc
+++ b/libstdc++-v3/testsuite/21_strings/basic_string/operations/rfind/char/1.cc
@@ -17,23 +17,23 @@
// with this library; see the file COPYING3. If not see
// <http://www.gnu.org/licenses/>.
-#include <string>
+#include <testsuite_string.h>
#include <testsuite_hooks.h>
// 21.3.6.2 basic_string rfind
void test01(void)
{
- typedef std::string::size_type csize_type;
- typedef std::string::const_reference cref;
- typedef std::string::reference ref;
- csize_type npos = std::string::npos;
+ typedef __gnu_test::string::size_type csize_type;
+ typedef __gnu_test::string::const_reference cref;
+ typedef __gnu_test::string::reference ref;
+ csize_type npos = __gnu_test::string::npos;
csize_type csz01, csz02;
const char str_lit01[] = "mave";
- const std::string str01("mavericks, santa cruz");
- std::string str02(str_lit01);
- std::string str03("s, s");
- std::string str04;
+ const __gnu_test::string str01("mavericks, santa cruz");
+ __gnu_test::string str02(str_lit01);
+ __gnu_test::string str03("s, s");
+ __gnu_test::string str04;
// size_type rfind(const string&, size_type pos = 0) const;
csz01 = str01.rfind(str01);
diff --git a/libstdc++-v3/testsuite/21_strings/basic_string/operations/rfind/char/2.cc b/libstdc++-v3/testsuite/21_strings/basic_string/operations/rfind/char/2.cc
index 587965505d5..9fecfcf80f1 100644
--- a/libstdc++-v3/testsuite/21_strings/basic_string/operations/rfind/char/2.cc
+++ b/libstdc++-v3/testsuite/21_strings/basic_string/operations/rfind/char/2.cc
@@ -17,14 +17,14 @@
// with this library; see the file COPYING3. If not see
// <http://www.gnu.org/licenses/>.
-#include <string>
+#include <testsuite_string.h>
#include <testsuite_hooks.h>
// 21.3.6.4 basic_string::find_last_of
void test02()
{
- std::string z("ab");
- std::string::size_type pos;
+ __gnu_test::string z("ab");
+ __gnu_test::string::size_type pos;
pos = z.find_last_of("ab");
VERIFY( pos == 1 );
pos = z.find_last_of("Xa");
@@ -32,13 +32,13 @@ void test02()
pos = z.find_last_of("Xb");
VERIFY( pos == 1 );
pos = z.find_last_of("XYZ");
- VERIFY( pos == std::string::npos );
+ VERIFY( pos == __gnu_test::string::npos );
pos = z.find_last_of('a');
VERIFY( pos == 0 );
pos = z.find_last_of('b');
VERIFY( pos == 1 );
pos = z.find_last_of('X');
- VERIFY( pos == std::string::npos );
+ VERIFY( pos == __gnu_test::string::npos );
}
int main()
diff --git a/libstdc++-v3/testsuite/21_strings/basic_string/operations/rfind/char/3.cc b/libstdc++-v3/testsuite/21_strings/basic_string/operations/rfind/char/3.cc
index 1ff9c94ba5b..69471e67bf1 100644
--- a/libstdc++-v3/testsuite/21_strings/basic_string/operations/rfind/char/3.cc
+++ b/libstdc++-v3/testsuite/21_strings/basic_string/operations/rfind/char/3.cc
@@ -17,23 +17,23 @@
// with this library; see the file COPYING3. If not see
// <http://www.gnu.org/licenses/>.
-#include <string>
+#include <testsuite_string.h>
#include <testsuite_hooks.h>
// 21.3.6.6 basic_string::find_last_not_of
void test03()
{
- typedef std::string::size_type csize_type;
- std::string::size_type pos;
- csize_type npos = std::string::npos;
+ typedef __gnu_test::string::size_type csize_type;
+ __gnu_test::string::size_type pos;
+ csize_type npos = __gnu_test::string::npos;
- std::string x;
+ __gnu_test::string x;
pos = x.find_last_not_of('X');
VERIFY( pos == npos );
pos = x.find_last_not_of("XYZ");
VERIFY( pos == npos );
- std::string y("a");
+ __gnu_test::string y("a");
pos = y.find_last_not_of('X');
VERIFY( pos == 0 );
pos = y.find_last_not_of('a');
@@ -43,7 +43,7 @@ void test03()
pos = y.find_last_not_of("a");
VERIFY( pos == npos );
- std::string z("ab");
+ __gnu_test::string z("ab");
pos = z.find_last_not_of('X');
VERIFY( pos == 1 );
pos = z.find_last_not_of("XYZ");
diff --git a/libstdc++-v3/testsuite/util/testsuite_string.h b/libstdc++-v3/testsuite/util/testsuite_string.h
index 7121ff8ec6d..7e61d984bdb 100644
--- a/libstdc++-v3/testsuite/util/testsuite_string.h
+++ b/libstdc++-v3/testsuite/util/testsuite_string.h
@@ -1,7 +1,7 @@
#ifndef _GLIBCXX_TESTSUITE_STRING_H
#define _GLIBCXX_TESTSUITE_STRING_H
-#ifdef _GLIBCXX_DEBUG
+#if defined(_GLIBCXX_DEBUG) && defined(_GLIBCXX_TEST_DEBUG_STRING)
# include <debug/string>
namespace __gnu_test
{
^ permalink raw reply [flat|nested] 2+ messages in thread
* Re: [PATCH] Complete __gnu_test::basic_string<>::compare support
2022-08-10 18:31 [PATCH] Complete __gnu_test::basic_string<>::compare support François Dumont
@ 2022-10-12 11:20 ` Jonathan Wakely
0 siblings, 0 replies; 2+ messages in thread
From: Jonathan Wakely @ 2022-10-12 11:20 UTC (permalink / raw)
To: François Dumont; +Cc: libstdc++, gcc-patches
On Wed, 10 Aug 2022 at 19:31, François Dumont via Libstdc++
<libstdc++@gcc.gnu.org> wrote:
>
> Here is another patch to complete __gnu_debug::basic_string<> Standard
> conformity. This one is adding the missing compare overloads.
>
> I also would like to propose to change how __gnu_debug::basic_string<>
> is tested. I considered activating <bits/basic_string.h> checks when
> _GLIBCXX_ASSERTIONS is defined but it turns out that to do so this
> light-debug mode should then also consider _GLIBCXX_DEBUG_PEDANTIC. I
> prefer to avoid this.
>
> So I restored previous behavior. I'm now checking for the
> _GLIBCXX_TEST_DEBUG_STRING macro to force usage of <debug/string>. This
> way I am testing it using:
>
> make check-debug CXXFLAGS=-D_GLIBCXX_TEST_DEBUG_STRING
>
> libstdc++: Add __gnu_debug::basic_string<>::compare overloads
>
> Rather than adding those implementations we are ading a:
> using _Base::compare;
>
> so that any compare method not implemented at __gnu_debug::basic_string
> level are injected from the base class.
>
> Also review how __gnu_debug::basic_string is tested. Now require to
> define
> _GLIBCXX_TEST_DEBUG_STRING when running 'make check-debug'.
>
> libstdc++-v3/ChangeLog
>
> * include/debug/string: Add using _Base::compare.
> (__gnu_debug::basic_string<>::compare(const
> basic_string<>&)): Remove.
> (__gnu_debug::basic_string<>::compare(size_type, size_type,
> const basic_string<>&)):
> Remove.
> (__gnu_debug::basic_string<>::compare(size_type, size_type,
> const basic_string<>&,
> size_type, size_type)): Remove.
> * testsuite/util/testsuite_string.h
> [_GLIBCXX_TEST_DEBUG_STRING]: Include <debug/string>.
> *
> testsuite/21_strings/basic_string/operations/compare/char/1.cc: Include
> testsuite_string.h
> and use __gnu_test::string.
> *
> testsuite/21_strings/basic_string/operations/compare/char/13650.cc:
> Likewise.
> *
> testsuite/21_strings/basic_string/operations/compare/char/2.cc: Likewise.
> *
> testsuite/21_strings/basic_string/operations/rfind/char/1.cc: Likewise.
> *
> testsuite/21_strings/basic_string/operations/rfind/char/2.cc: Likewise.
> *
> testsuite/21_strings/basic_string/operations/rfind/char/3.cc: Likewise.
> *
> testsuite/21_strings/basic_string/operations/compare/wchar_t/1.cc:
> Include testsuite_string.h
> and use __gnu_test::wstring.
> *
> testsuite/21_strings/basic_string/operations/compare/wchar_t/13650.cc:
> Likewise.
> *
> testsuite/21_strings/basic_string/operations/compare/wchar_t/2.cc: Likewise.
>
> Tested under Linux x86_64.
>
> Ok to commit ?
OK. I like the change to how debug strings are tested, thanks.
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2022-10-12 11:20 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-08-10 18:31 [PATCH] Complete __gnu_test::basic_string<>::compare support François Dumont
2022-10-12 11:20 ` Jonathan Wakely
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).