This is the mail archive of the
libstdc++@gcc.gnu.org
mailing list for the libstdc++ project.
Re: throw(), pure and const flags on functions
> Jan Hubicka wrote:
> > I will re-implement the warning and see if I can collect some useful
> > data. It however require someone with knowledge of the library to
> > decide what really is nothrow/const/pure and what is useful to decorate.
> >
> Sounds like an excellent plan. Thanks a lot.
> > My knowledge of STL is very limited.
> >
> It shows: STL is a pre-standard acronym, obsolete since 1997 ;) ;)
OK, I will try to mind that ;))
Well, I have my warning ready, so lets see if we all understand what
this is about. This is first patch I would like to propose adding
nothrow markers to the rbtrees functions.
I noticed that there are also two functions that are used internally
only in .cc file but not marked static. Why this is so? I added static
keyword there.
Does the following patch look OK? If so, i would like to commit it and
follo9wup with more .cc files.
We also need to decide how to handle the attributes. Are we going to
use direct __attribute__ ((pure)) or have some kind of ATTRIBUTE_PURE
define somewhere? And if so, where it should be defined?
Honza
* tree.cc (_Rb_tree_increment, _Rb_tree_decrement,
_Rb_tree_rebalance_for_erase, _Rb_tree_black_count): Mark nothrow.
(_Rb_tree_rotate_left, _Rb_tree_rotate_right): Mark static.
* stl_tree.h (_Rb_tree_increment, _Rb_tree_decrement,
_Rb_tree_insert_and_rebalance, _Rb_tree_rebalance_for_erase,
_Rb_tree_black_count): Mark nothrow.
Index: src/tree.cc
===================================================================
--- src/tree.cc (revision 145985)
+++ src/tree.cc (working copy)
@@ -55,7 +55,7 @@
_GLIBCXX_BEGIN_NAMESPACE(std)
_Rb_tree_node_base*
- _Rb_tree_increment(_Rb_tree_node_base* __x)
+ _Rb_tree_increment(_Rb_tree_node_base* __x) throw ()
{
if (__x->_M_right != 0)
{
@@ -78,13 +78,13 @@
}
const _Rb_tree_node_base*
- _Rb_tree_increment(const _Rb_tree_node_base* __x)
+ _Rb_tree_increment(const _Rb_tree_node_base* __x) throw ()
{
return _Rb_tree_increment(const_cast<_Rb_tree_node_base*>(__x));
}
_Rb_tree_node_base*
- _Rb_tree_decrement(_Rb_tree_node_base* __x)
+ _Rb_tree_decrement(_Rb_tree_node_base* __x) throw ()
{
if (__x->_M_color == _S_red
&& __x->_M_parent->_M_parent == __x)
@@ -110,12 +110,12 @@
}
const _Rb_tree_node_base*
- _Rb_tree_decrement(const _Rb_tree_node_base* __x)
+ _Rb_tree_decrement(const _Rb_tree_node_base* __x) throw ()
{
return _Rb_tree_decrement(const_cast<_Rb_tree_node_base*>(__x));
}
- void
+ static void
_Rb_tree_rotate_left(_Rb_tree_node_base* const __x,
_Rb_tree_node_base*& __root)
{
@@ -136,7 +136,7 @@
__x->_M_parent = __y;
}
- void
+ static void
_Rb_tree_rotate_right(_Rb_tree_node_base* const __x,
_Rb_tree_node_base*& __root)
{
@@ -161,7 +161,7 @@
_Rb_tree_insert_and_rebalance(const bool __insert_left,
_Rb_tree_node_base* __x,
_Rb_tree_node_base* __p,
- _Rb_tree_node_base& __header)
+ _Rb_tree_node_base& __header) throw ()
{
_Rb_tree_node_base *& __root = __header._M_parent;
@@ -250,7 +250,7 @@
_Rb_tree_node_base*
_Rb_tree_rebalance_for_erase(_Rb_tree_node_base* const __z,
- _Rb_tree_node_base& __header)
+ _Rb_tree_node_base& __header) throw ()
{
_Rb_tree_node_base *& __root = __header._M_parent;
_Rb_tree_node_base *& __leftmost = __header._M_left;
@@ -411,7 +411,7 @@
unsigned int
_Rb_tree_black_count(const _Rb_tree_node_base* __node,
- const _Rb_tree_node_base* __root)
+ const _Rb_tree_node_base* __root) throw ()
{
if (__node == 0)
return 0;
Index: include/bits/stl_tree.h
===================================================================
--- include/bits/stl_tree.h (revision 145985)
+++ include/bits/stl_tree.h (working copy)
@@ -138,16 +138,16 @@
};
_Rb_tree_node_base*
- _Rb_tree_increment(_Rb_tree_node_base* __x);
+ _Rb_tree_increment(_Rb_tree_node_base* __x) throw ();
const _Rb_tree_node_base*
- _Rb_tree_increment(const _Rb_tree_node_base* __x);
+ _Rb_tree_increment(const _Rb_tree_node_base* __x) throw ();
_Rb_tree_node_base*
- _Rb_tree_decrement(_Rb_tree_node_base* __x);
+ _Rb_tree_decrement(_Rb_tree_node_base* __x) throw ();
const _Rb_tree_node_base*
- _Rb_tree_decrement(const _Rb_tree_node_base* __x);
+ _Rb_tree_decrement(const _Rb_tree_node_base* __x) throw ();
template<typename _Tp>
struct _Rb_tree_iterator
@@ -310,11 +310,11 @@
_Rb_tree_insert_and_rebalance(const bool __insert_left,
_Rb_tree_node_base* __x,
_Rb_tree_node_base* __p,
- _Rb_tree_node_base& __header);
+ _Rb_tree_node_base& __header) throw ();
_Rb_tree_node_base*
_Rb_tree_rebalance_for_erase(_Rb_tree_node_base* const __z,
- _Rb_tree_node_base& __header);
+ _Rb_tree_node_base& __header) throw ();
template<typename _Key, typename _Val, typename _KeyOfValue,
@@ -1450,7 +1450,7 @@
unsigned int
_Rb_tree_black_count(const _Rb_tree_node_base* __node,
- const _Rb_tree_node_base* __root);
+ const _Rb_tree_node_base* __root) throw ();
template<typename _Key, typename _Val, typename _KeyOfValue,
typename _Compare, typename _Alloc>