This is the mail archive of the libstdc++@gcc.gnu.org mailing list for the libstdc++ project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

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>


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]