Patchwork [v3] Fix profile mode failures

login
register
mail settings
Submitter Jonathan Wakely
Date Nov. 6, 2012, 12:06 a.m.
Message ID <CAH6eHdQ5XnYxjDZbGb24MEiOQhaB_axhmP19-ddeaEWdQYRBYA@mail.gmail.com>
Download mbox | patch
Permalink /patch/197364/
State New
Headers show

Comments

Jonathan Wakely - Nov. 6, 2012, 12:06 a.m.
* include/profile/deque: Constrain InputIterator parameters.
        * include/profile/forward_list: Likewise.
        * include/profile/list: Likewise.
        * include/profile/map.h: Likewise.
        * include/profile/multimap.h: Likewise.
        * include/profile/set.h: Likewise.
        * include/profile/multiset.h: Likewise.
        * include/profile/vector: Likewise.

Tested x86_64-linux, committed to trunk.

There's still a failure for 23_containers/map/modifiers/emplace/1.cc
(which didn't even compile in profile mode previously) that I'll look
into.
commit 1f6cb06a2b503db6ccc34a5379c53267ed836a59
Author: Jonathan Wakely <jwakely.gcc@gmail.com>
Date:   Mon Nov 5 21:06:33 2012 +0000

    	* include/profile/deque: Constrain InputIterator parameters.
    	* include/profile/forward_list: Likewise.
    	* include/profile/list: Likewise.
    	* include/profile/map.h: Likewise.
    	* include/profile/multimap.h: Likewise.
    	* include/profile/set.h: Likewise.
    	* include/profile/multiset.h: Likewise.
    	* include/profile/vector: Likewise.

Patch

diff --git a/libstdc++-v3/include/profile/deque b/libstdc++-v3/include/profile/deque
index 48a18c9..99cc465 100644
--- a/libstdc++-v3/include/profile/deque
+++ b/libstdc++-v3/include/profile/deque
@@ -1,6 +1,6 @@ 
 // Profiling deque implementation -*- C++ -*-
 
-// Copyright (C) 2009, 2010, 2011 Free Software Foundation, Inc.
+// Copyright (C) 2009-2012 Free Software Foundation, Inc.
 //
 // This file is part of the GNU ISO C++ Library.  This library is free
 // software; you can redistribute it and/or modify it under the
@@ -79,7 +79,12 @@  namespace __profile
       : _Base(__n, __value, __a) { }
 #endif
 
-      template<class _InputIterator>
+#ifdef __GXX_EXPERIMENTAL_CXX0X__
+      template<typename _InputIterator,
+	       typename = std::_RequireInputIter<_InputIterator>>
+#else
+      template<typename _InputIterator>
+#endif
         deque(_InputIterator __first, _InputIterator __last,
 	      const _Allocator& __a = _Allocator())
 	: _Base(__first, __last, __a)
@@ -129,7 +134,12 @@  namespace __profile
       }
 #endif
 
-      template<class _InputIterator>
+#ifdef __GXX_EXPERIMENTAL_CXX0X__
+      template<typename _InputIterator,
+	       typename = std::_RequireInputIter<_InputIterator>>
+#else
+      template<typename _InputIterator>
+#endif
         void
         assign(_InputIterator __first, _InputIterator __last)
         {
@@ -343,7 +353,12 @@  namespace __profile
 	_Base::insert(__position, __n, __x);
       }
 
-      template<class _InputIterator>
+#ifdef __GXX_EXPERIMENTAL_CXX0X__
+      template<typename _InputIterator,
+	       typename = std::_RequireInputIter<_InputIterator>>
+#else
+      template<typename _InputIterator>
+#endif
         void
         insert(iterator __position,
 	       _InputIterator __first, _InputIterator __last)
diff --git a/libstdc++-v3/include/profile/forward_list b/libstdc++-v3/include/profile/forward_list
index a44ea7a..9cb5820 100644
--- a/libstdc++-v3/include/profile/forward_list
+++ b/libstdc++-v3/include/profile/forward_list
@@ -77,7 +77,8 @@  namespace __profile
       : _Base(__n, __value, __al)
       { }
 
-      template<typename _InputIterator>
+      template<typename _InputIterator,
+	       typename = std::_RequireInputIter<_InputIterator>>
         forward_list(_InputIterator __first, _InputIterator __last,
                      const _Alloc& __al = _Alloc())
         : _Base(__first, __last, __al)
diff --git a/libstdc++-v3/include/profile/list b/libstdc++-v3/include/profile/list
index 33b1ae6..2f8535e 100644
--- a/libstdc++-v3/include/profile/list
+++ b/libstdc++-v3/include/profile/list
@@ -1,6 +1,6 @@ 
 // Profiling list implementation -*- C++ -*-
 
-// Copyright (C) 2009, 2010, 2011 Free Software Foundation, Inc.
+// Copyright (C) 2009-2012 Free Software Foundation, Inc.
 //
 // This file is part of the GNU ISO C++ Library.  This library is free
 // software; you can redistribute it and/or modify it under the
@@ -99,7 +99,12 @@  template<typename _Tp, typename _Allocator = std::allocator<_Tp> >
       }
 #endif
 
+#ifdef __GXX_EXPERIMENTAL_CXX0X__
+      template<typename _InputIterator,
+	       typename = std::_RequireInputIter<_InputIterator>>
+#else
       template<class _InputIterator>
+#endif
       list(_InputIterator __first, _InputIterator __last,
 	   const _Allocator& __a = _Allocator())
       : _Base(__first, __last, __a)
@@ -171,7 +176,12 @@  template<typename _Tp, typename _Allocator = std::allocator<_Tp> >
       {	_Base::assign(__l); }
 #endif
 
+#ifdef __GXX_EXPERIMENTAL_CXX0X__
+      template<typename _InputIterator,
+	       typename = std::_RequireInputIter<_InputIterator>>
+#else
       template<class _InputIterator>
+#endif
         void
         assign(_InputIterator __first, _InputIterator __last)
         { _Base::assign(__first, __last); }
@@ -328,7 +338,8 @@  template<typename _Tp, typename _Allocator = std::allocator<_Tp> >
         emplace(iterator __position, _Args&&... __args)
 	{
 	  return iterator(_Base::emplace(__position.base(),
-                                         std::forward<_Args>(__args)...));
+                                         std::forward<_Args>(__args)...),
+			  this);
 	}
 #endif
 
@@ -363,14 +374,19 @@  template<typename _Tp, typename _Allocator = std::allocator<_Tp> >
 	_Base::insert(__position.base(), __n, __x);
       }
 
+#ifdef __GXX_EXPERIMENTAL_CXX0X__
+      template<typename _InputIterator,
+	       typename = std::_RequireInputIter<_InputIterator>>
+#else
       template<class _InputIterator>
+#endif
         void
         insert(iterator __position, _InputIterator __first,
 	       _InputIterator __last)
-      {
-        _M_profile_insert(this, __position, size());
-        _Base::insert(__position.base(), __first, __last);
-      }
+	{
+	  _M_profile_insert(this, __position, size());
+	  _Base::insert(__position.base(), __first, __last);
+	}
 
       iterator
       erase(iterator __position)
diff --git a/libstdc++-v3/include/profile/map.h b/libstdc++-v3/include/profile/map.h
index dcc6931..fe2f456 100644
--- a/libstdc++-v3/include/profile/map.h
+++ b/libstdc++-v3/include/profile/map.h
@@ -69,7 +69,12 @@  namespace __profile
       : _Base(__comp, __a)
       { __profcxx_map_to_unordered_map_construct(this); }
 
+#ifdef __GXX_EXPERIMENTAL_CXX0X__
+      template<typename _InputIterator,
+	       typename = std::_RequireInputIter<_InputIterator>>
+#else
       template<typename _InputIterator>
+#endif
         map(_InputIterator __first, _InputIterator __last,
 	    const _Compare& __comp = _Compare(),
 	    const _Allocator& __a = _Allocator())
@@ -252,7 +257,7 @@  namespace __profile
 	emplace_hint(const_iterator __pos, _Args&&... __args)
 	{
 	  size_type size_before = size();
-	  auto __res = _Base::emplace_hint(__pos.base(),
+	  auto __res = _Base::emplace_hint(__pos,
 					   std::forward<_Args>(__args)...);
 	  __profcxx_map_to_unordered_map_insert(this, size_before,
 						size() - size_before);
@@ -326,7 +331,12 @@  namespace __profile
       }
 #endif
 
+#ifdef __GXX_EXPERIMENTAL_CXX0X__
+      template<typename _InputIterator,
+	       typename = std::_RequireInputIter<_InputIterator>>
+#else
       template<typename _InputIterator>
+#endif
         void
         insert(_InputIterator __first, _InputIterator __last)
         {
diff --git a/libstdc++-v3/include/profile/multimap.h b/libstdc++-v3/include/profile/multimap.h
index 2268161..42662af 100644
--- a/libstdc++-v3/include/profile/multimap.h
+++ b/libstdc++-v3/include/profile/multimap.h
@@ -68,7 +68,12 @@  namespace __profile
 			const _Allocator& __a = _Allocator())
       : _Base(__comp, __a) { }
 
+#ifdef __GXX_EXPERIMENTAL_CXX0X__
+      template<typename _InputIterator,
+	       typename = std::_RequireInputIter<_InputIterator>>
+#else
       template<typename _InputIterator>
+#endif
       multimap(_InputIterator __first, _InputIterator __last,
 	       const _Compare& __comp = _Compare(),
 	       const _Allocator& __a = _Allocator())
@@ -234,7 +239,12 @@  namespace __profile
 					std::forward<_Pair>(__x))); }
 #endif
 
+#ifdef __GXX_EXPERIMENTAL_CXX0X__
+      template<typename _InputIterator,
+	       typename = std::_RequireInputIter<_InputIterator>>
+#else
       template<typename _InputIterator>
+#endif
         void
         insert(_InputIterator __first, _InputIterator __last)
         { _Base::insert(__first, __last); }
diff --git a/libstdc++-v3/include/profile/multiset.h b/libstdc++-v3/include/profile/multiset.h
index f76b4fa..3588797 100644
--- a/libstdc++-v3/include/profile/multiset.h
+++ b/libstdc++-v3/include/profile/multiset.h
@@ -1,6 +1,6 @@ 
 // Profiling multiset implementation -*- C++ -*-
 
-// Copyright (C) 2009, 2010, 2011 Free Software Foundation, Inc.
+// Copyright (C) 2009-2012 Free Software Foundation, Inc.
 //
 // This file is part of the GNU ISO C++ Library.  This library is free
 // software; you can redistribute it and/or modify it under the
@@ -68,7 +68,12 @@  namespace __profile
 			const _Allocator& __a = _Allocator())
       : _Base(__comp, __a) { }
 
+#ifdef __GXX_EXPERIMENTAL_CXX0X__
+      template<typename _InputIterator,
+	       typename = std::_RequireInputIter<_InputIterator>>
+#else
       template<typename _InputIterator>
+#endif
         multiset(_InputIterator __first, _InputIterator __last,
 		 const _Compare& __comp = _Compare(),
 		 const _Allocator& __a = _Allocator())
@@ -215,7 +220,12 @@  namespace __profile
       { return iterator(_Base::insert(__position, std::move(__x))); }
 #endif
 
+#ifdef __GXX_EXPERIMENTAL_CXX0X__
+      template<typename _InputIterator,
+	       typename = std::_RequireInputIter<_InputIterator>>
+#else
       template<typename _InputIterator>
+#endif
         void
         insert(_InputIterator __first, _InputIterator __last)
         { _Base::insert(__first, __last); }
diff --git a/libstdc++-v3/include/profile/set.h b/libstdc++-v3/include/profile/set.h
index c0aa180..5aadab8 100644
--- a/libstdc++-v3/include/profile/set.h
+++ b/libstdc++-v3/include/profile/set.h
@@ -1,6 +1,6 @@ 
 // Profiling set implementation -*- C++ -*-
 
-// Copyright (C) 2009, 2010, 2011 Free Software Foundation, Inc.
+// Copyright (C) 2009-2012 Free Software Foundation, Inc.
 //
 // This file is part of the GNU ISO C++ Library.  This library is free
 // software; you can redistribute it and/or modify it under the
@@ -68,7 +68,12 @@  namespace __profile
 		   const _Allocator& __a = _Allocator())
       : _Base(__comp, __a) { }
 
+#ifdef __GXX_EXPERIMENTAL_CXX0X__
+      template<typename _InputIterator,
+	       typename = std::_RequireInputIter<_InputIterator>>
+#else
       template<typename _InputIterator>
+#endif
         set(_InputIterator __first, _InputIterator __last,
 	    const _Compare& __comp = _Compare(),
 	    const _Allocator& __a = _Allocator())
@@ -230,7 +235,12 @@  namespace __profile
       { return iterator(_Base::insert(__position, std::move(__x))); }
 #endif
 
-      template <typename _InputIterator>
+#ifdef __GXX_EXPERIMENTAL_CXX0X__
+      template<typename _InputIterator,
+	       typename = std::_RequireInputIter<_InputIterator>>
+#else
+      template<typename _InputIterator>
+#endif
         void
         insert(_InputIterator __first, _InputIterator __last)
         { _Base::insert(__first, __last); }
diff --git a/libstdc++-v3/include/profile/vector b/libstdc++-v3/include/profile/vector
index 8a3e681..fcd6962 100644
--- a/libstdc++-v3/include/profile/vector
+++ b/libstdc++-v3/include/profile/vector
@@ -1,6 +1,6 @@ 
 // Profiling vector implementation -*- C++ -*-
 
-// Copyright (C) 2009, 2010, 2011 Free Software Foundation, Inc.
+// Copyright (C) 2009-2012 Free Software Foundation, Inc.
 //
 // This file is part of the GNU ISO C++ Library.  This library is free
 // software; you can redistribute it and/or modify it under the
@@ -109,7 +109,12 @@  namespace __profile
       }
 #endif
 
-      template<class _InputIterator>
+#ifdef __GXX_EXPERIMENTAL_CXX0X__
+      template<typename _InputIterator,
+	       typename = std::_RequireInputIter<_InputIterator>>
+#else
+      template<typename _InputIterator>
+#endif
         vector(_InputIterator __first, _InputIterator __last,
 	       const _Allocator& __a = _Allocator())
 	: _Base(__first, __last, __a)
@@ -401,7 +406,12 @@  namespace __profile
         _M_profile_resize(this, __old_size, this->capacity());
       }
 
-      template<class _InputIterator>
+#ifdef __GXX_EXPERIMENTAL_CXX0X__
+      template<typename _InputIterator,
+	       typename = std::_RequireInputIter<_InputIterator>>
+#else
+      template<typename _InputIterator>
+#endif
       void
       insert(iterator __position,
              _InputIterator __first, _InputIterator __last)