[prev in list] [next in list] [prev in thread] [next in thread]
List: gcc-bugs
Subject: libstdc++/6886: bit vector iterator uses wrong 1 constant
From: meissner () suse ! de
Date: 2002-05-31 12:12:31
[Download RAW message or body]
> Number: 6886
> Category: libstdc++
> Synopsis: bit vector iterator uses wrong 1 constant
> Confidential: no
> Severity: critical
> Priority: medium
> Responsible: unassigned
> State: open
> Class: sw-bug
> Submitter-Id: net
> Arrival-Date: Fri May 31 05:16:00 PDT 2002
> Closed-Date:
> Last-Modified:
> Originator: Marcus Meissner <meissner@suse.de>
> Release: 3.1 20020410 (prerelease)
> Organization:
SuSE Linux AG
> Environment:
System: Linux gershwin 2.4.18-SMP #1 SMP Mon May 13 09:48:57 UTC 2002 x86_64 unknown
Architecture: x86_64
host: x86_64-unknown-linux-gnu
build: x86_64-unknown-linux-gnu
target: x86_64-unknown-linux-gnu
configured with: /home/hammer/gcc/configure --prefix=/usr --host=x86_64-unknown-linux \
--build=x86_64-unknown-linux --libdir=/usr/lib64 --enable-languages=c,c++ \
--enable-threads=posix --disable-nls
> Description:
The stl bitvector implementation contains in both the iterator and
const_iterator implementation the code:
reference operator*() const { return reference(_M_p, 1U << _M_offset); }
Since the bit_type is an unsigned long, it should be 1UL here.
I have attached a testcase exhibiting the problem and a fix in
the Fix section.
Ciao, Marcus
> How-To-Repeat:
#include <assert.h>
#include <vector>
typedef std::vector<bool> bvec;
int
main() {
int i, num = 0;
bvec v;
v.resize(66);
for (i = 0 ; i < 66 ; i++)
v[i] = 0;
v[1] = 1;
v[33] = 1;
v[49] = 1;
v[65] = 1;
for (bvec::iterator j = v.begin() ; j < v.end() ; j++) {
if (bool(*j)) num++;
}
assert (num == 4);
return 0;
}
> Fix:
--- libstdc++-v3/include/bits/stl_bvector.h.long Fri May 31 11:35:24 2002
+++ libstdc++-v3/include/bits/stl_bvector.h Fri May 31 11:35:36 2002
@@ -166,7 +166,7 @@
_Bit_iterator(_Bit_type * __x, unsigned int __y)
: _Bit_iterator_base(__x, __y) {}
- reference operator*() const { return reference(_M_p, 1U << _M_offset); }
+ reference operator*() const { return reference(_M_p, 1UL << _M_offset); }
iterator& operator++() {
_M_bump_up();
return *this;
@@ -223,7 +223,7 @@
: _Bit_iterator_base(__x._M_p, __x._M_offset) {}
const_reference operator*() const {
- return _Bit_reference(_M_p, 1U << _M_offset);
+ return _Bit_reference(_M_p, 1UL << _M_offset);
}
const_iterator& operator++() {
_M_bump_up();
> Release-Note:
> Audit-Trail:
> Unformatted:
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic