Another testsuite patch and a bug in string.find
Anthony Williams
anthony_w.geo@yahoo.com
Wed Jun 7 03:49:00 GMT 2000
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
Here is a patch to testsuite/21_strings/find.cc, which I think makes
it more standard compliant.
The patch relates to empty strings. An empty string object contains
no characters, so I believe that it should be found at all positions,
and the following code should produce the given output. This
highlights a bug in string.find, since libstdc++ produces the second
set of output.
include <iostream>
#include <string>
int main()
{
std::string a("hello");
std::string b;
for(unsigned i=0;i<=a.size();++i)
std::cout<<a.find(b,i)<<std::endl;
}
Expected output:
0
1
2
3
4
4294967295
libstdc++-v3 output:
5
5
5
5
5
5
Anthony
testsuite/21_strings/find.cc: Empty strings can be found at all
positions
Index: find.cc
===================================================================
RCS file: /cvs/gcc/egcs/libstdc++-v3/testsuite/21_strings/find.cc,v
retrieving revision 1.1
diff -u -p -r1.1 find.cc
- --- find.cc 2000/04/21 20:33:33 1.1
+++ find.cc 2000/06/07 10:36:09
@@ -56,21 +56,22 @@ bool test01(void)
test &= csz01 == 8;
csz01 = str01.find(str03, 12);
test &= csz01 == npos;
- - // It is implementation-defined if a given string contains an
empty
- - // string. The only two times a char_type() (== empty string)
ending
- - // element is required to be part of the string is on c_str() and
- - // operator[size()] const: the indeterminate, stored state of the
- - // string can vary, and not include a terminal char_type().
+
+ // An empty string consists of no characters
+ // therefore it should be found at every point in a string,
+ // except beyond the end
csz01 = str01.find(str04, 0);
- - test &= csz01 == npos || csz01 == str01.size();
+ test &= csz01 == 0;
csz01 = str01.find(str04, 5);
- - test &= csz01 == npos || csz01 == str01.size();
+ test &= csz01 == 5;
+ csz01 = str01.find(str04, str01.size());
+ test &= csz01 == npos;
// size_type find(const char* s, size_type pos, size_type n)
const;
csz01 = str01.find(str_lit01, 0, 3);
test &= csz01 == 0;
csz01 = str01.find(str_lit01, 3, 0);
- - test &= csz01 == npos;
+ test &= csz01 == 3; // zero length string should be found at pos
// size_type find(const char* s, size_type pos = 0) const;
csz01 = str01.find(str_lit01);
@@ -107,15 +108,15 @@ bool test01(void)
csz01 = str01.find_first_of(str05, 4);
test &= csz01 == 4;
- - // It is implementation-defined if a given string contains an
empty
- - // string. The only two times a char_type() (== empty string)
ending
- - // element is required to be part of the string is on c_str() and
- - // operator[size()] const: the indeterminate, stored state of the
- - // string can vary, and not include a terminal char_type().
+ // An empty string consists of no characters
+ // therefore it should be found at every point in a string,
+ // except beyond the end
+ // However, str1.find_first_of(str2,pos) finds the first character
in
+ // str1 (starting at pos) that exists in str2, which is none for
empty str2
csz01 = str01.find_first_of(str04, 0);
- - test &= csz01 == npos || csz01 == str01.size();
+ test &= csz01 == npos;
csz01 = str01.find_first_of(str04, 5);
- - test &= csz01 == npos || csz01 == str01.size();
+ test &= csz01 == npos;
// size_type find_first_of(const char* s, size_type pos, size_type
n) const;
csz01 = str01.find_first_of(str_lit01, 0, 3);
PGP Fingerprint:
0E2D D32A 8732 DC31 804C D435 9BF0 F8FE 1C1B 9AD5
PGP Key at: http://i3.yimg.com/3/c7e5ee24/g/68fc2307.asc
-----BEGIN PGP SIGNATURE-----
Version: PGPfreeware 6.5.1 for non-commercial use < http://www.pgp.com >
Comment: PGP Key at: http://i3.yimg.com/3/c7e5ee24/g/68fc2307.asc
iQA/AwUBOT4oWJvw+P4cG5rVEQIoSQCeOSpeFs2Nop06UHzMjZkVjI6a+mkAnRIY
c7Xwm/ZImM9taKVPEJMj0MDt
=kN6L
-----END PGP SIGNATURE-----
__________________________________________________
Do You Yahoo!?
Talk to your friends online with Yahoo! Messenger.
http://im.yahoo.com
More information about the Libstdc++
mailing list