Bug 44436 - [C++0x] Implement emplace* in associative containers
Summary: [C++0x] Implement emplace* in associative containers
Status: RESOLVED FIXED
Alias: None
Product: gcc
Classification: Unclassified
Component: libstdc++ (show other bugs)
Version: 4.5.0
: P3 normal
Target Milestone: 4.8.0
Assignee: Not yet assigned to anyone
URL:
Keywords:
: 44872 46148 (view as bug list)
Depends on:
Blocks:
 
Reported: 2010-06-06 19:47 UTC by John Keeping
Modified: 2012-09-25 08:46 UTC (History)
6 users (show)

See Also:
Host:
Target:
Build:
Known to work:
Known to fail:
Last reconfirmed: 2010-06-21 17:48:26


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description John Keeping 2010-06-06 19:47:15 UTC
C++0x associative containers should have emplace() and emplace_hint() methods, but those in libstdc++ do not.
Comment 1 Paolo Carlini 2010-06-07 14:03:01 UTC
Yes, we lack *tons* of other C++0x things.
Comment 2 Paolo Carlini 2010-06-21 17:47:56 UTC
Reopening
Comment 3 Paolo Carlini 2010-06-21 17:48:26 UTC
I'm working on these, maybe will be ready in time for 4.6.0.
Comment 4 Jonathan Wakely 2010-07-08 14:20:04 UTC
*** Bug 44872 has been marked as a duplicate of this bug. ***
Comment 5 Paolo Carlini 2010-07-08 14:28:41 UTC
Just to clarify a bit: this wasn't an *oversight*. We had the *nasty* problem in the Draft C++0x Standard with std::pair, which essentially made impossible adding the emplace_* members to std::map, std::multimap, etc, without breaking existing user code. Thus we waited on that, until things got clarified in this whole area. Now it's actually possible to work on those facilities.

Anyway, much more generally: we are *not* claiming any sort of conformance to non existing (yet) standards, we are still in experimental mode for C++0x. Please be patient.
Comment 6 Jonathan Wakely 2010-10-23 15:29:03 UTC
*** Bug 46148 has been marked as a duplicate of this bug. ***
Comment 7 Paolo Carlini 2010-10-23 16:01:45 UTC
And now we have n3178 too, great ;-/
Comment 8 Paolo Carlini 2010-10-26 12:17:06 UTC
First, I'm going to add the new insert overloads to the unordered containers.
Comment 9 Jonathan Wakely 2010-10-26 12:27:33 UTC
taking 'iterator' params for consistency, or 'const_iterator' because we don't have to maintain compatibility?
Comment 10 Paolo Carlini 2010-10-26 12:31:28 UTC
I would say const_iterator, consistently with the existing insert and erase overloads...
Comment 11 Jonathan Wakely 2010-10-26 12:39:59 UTC
doh, of course, we already use const_iterator in the unordered containers. sorry!
Comment 12 paolo@gcc.gnu.org 2010-10-28 16:01:11 UTC
Author: paolo
Date: Thu Oct 28 16:01:05 2010
New Revision: 166030

URL: http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=166030
Log:
2010-10-28  Paolo Carlini  <paolo.carlini@oracle.com>

	PR libstdc++/44436 (partial)
	* include/bits/hashtable.h (_Hashtable<>::insert(value_type&&),
	insert(_Pair&&), insert(const_iterator, value_type&&),
	insert(const_iterator, _Pair&&)): Add.
	(_M_allocate_node, _M_insert, _M_insert_bucket): Templatize.
	* include/bits/hashtable_policy.h (__detail::_Select1st): Add; use
	it throughout.
	(_Map_base<>::operator[](_Key&&)): Add.
	* include/bits/unordered_map.h: Use __detail::_Select1st throughout.
	* include/debug/unordered_map: Update.
	* include/debug/unordered_set: Likewise.
	* include/profile/unordered_map: Likewise.
	* include/profile/unordered_set: Likewise.
	* testsuite/util/testsuite_rvalref.h (struct hash<rvalstruct>): Add;
	minor tweaks throughout, use deleted special members.
	* testsuite/23_containers/unordered_map/insert/map_single_move-1.cc:
	New.
	* testsuite/23_containers/unordered_map/insert/map_single_move-2.cc:
	Likewise.
	* testsuite/23_containers/unordered_map/insert/array_syntax_move.cc:
	Likewise.
	* testsuite/23_containers/unordered_multimap/insert/
	multimap_single_move-1.cc: Likewise.
	* testsuite/23_containers/unordered_multimap/insert/
	multimap_single_move-2.cc: Likewise.
	* testsuite/23_containers/unordered_set/insert/set_single_move.cc:
	Likewise.
	* testsuite/23_containers/unordered_multiset/insert/
	multiset_single_move.cc: Likewise.

	* testsuite/23_containers/unordered_map/insert/array_syntax.cc:
	Minor cosmetic changes.

Added:
    trunk/libstdc++-v3/testsuite/23_containers/unordered_map/insert/array_syntax_move.cc
    trunk/libstdc++-v3/testsuite/23_containers/unordered_map/insert/map_single_move-1.cc
    trunk/libstdc++-v3/testsuite/23_containers/unordered_map/insert/map_single_move-2.cc
    trunk/libstdc++-v3/testsuite/23_containers/unordered_multimap/insert/multimap_single_move-1.cc
    trunk/libstdc++-v3/testsuite/23_containers/unordered_multimap/insert/multimap_single_move-2.cc
    trunk/libstdc++-v3/testsuite/23_containers/unordered_multiset/insert/multiset_single_move.cc
    trunk/libstdc++-v3/testsuite/23_containers/unordered_set/insert/set_single_move.cc
Modified:
    trunk/libstdc++-v3/ChangeLog
    trunk/libstdc++-v3/include/bits/hashtable.h
    trunk/libstdc++-v3/include/bits/hashtable_policy.h
    trunk/libstdc++-v3/include/bits/unordered_map.h
    trunk/libstdc++-v3/include/debug/unordered_map
    trunk/libstdc++-v3/include/debug/unordered_set
    trunk/libstdc++-v3/include/profile/unordered_map
    trunk/libstdc++-v3/include/profile/unordered_set
    trunk/libstdc++-v3/testsuite/23_containers/unordered_map/insert/array_syntax.cc
    trunk/libstdc++-v3/testsuite/util/testsuite_rvalref.h
Comment 13 paolo@gcc.gnu.org 2010-11-10 19:08:54 UTC
Author: paolo
Date: Wed Nov 10 19:08:49 2010
New Revision: 166551

URL: http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=166551
Log:
2010-11-10  Paolo Carlini  <paolo.carlini@oracle.com>

	PR libstdc++/44436 (partial)
	PR libstdc++/46148
        * include/bits/stl_tree.h (_Rb_tree<>::_M_insert_, _M_insert_lower,
	_M_insert_equal_lower, _M_insert_unique, _M_insert_equal,
	_M_insert_unique_, _M_insert_equal_): Templatize in C++0x mode,
	use _GLIBCXX_FORWARD throughout.
        * include/bits/stl_map.h (map<>::insert(_Pair&&),
	insert(const_iterator, _Pair&&), operator[](key_type&&): Add.
        * include/bits/stl_set.h (set<>::insert(value_type&&),
	insert(const_iterator, value_type&&)): Likewise.
        * include/bits/stl_multimap.h (multimap<>::insert(_Pair&&),
	insert(const_iterator, _Pair&&)): Likewise.
        * include/bits/stl_multiset.h (multiset<>::insert(value_type&&),
	insert(const_iterator, value_type&&)): Likewise.
	* include/debug/set.h: Adjust.
        * include/debug/multiset.h: Likewise.
        * include/debug/map.h: Likewise.
        * include/debug/multimap.h: Likewise.
        * include/profile/set.h: Likewise.
        * include/profile/multiset.h: Likewise.
        * include/profile/map.h: Likewise.
        * include/profile/multimap.h: Likewise.
        * testsuite/23_containers/multimap/modifiers/insert/1.cc: New.
        * testsuite/23_containers/multimap/modifiers/insert/2.cc: Likewise.
        * testsuite/23_containers/multimap/modifiers/insert/3.cc: Likewise.
        * testsuite/23_containers/multimap/modifiers/insert/4.cc: Likewise.
        * testsuite/23_containers/set/modifiers/insert/2.cc: Likewise.
        * testsuite/23_containers/set/modifiers/insert/3.cc: Likewise.
        * testsuite/23_containers/multiset/modifiers/insert/3.cc: Likewise.
        * testsuite/23_containers/multiset/modifiers/insert/4.cc: Likewise.
        * testsuite/23_containers/map/modifiers/insert/2.cc: Likewise.
        * testsuite/23_containers/map/modifiers/insert/3.cc: Likewise.
        * testsuite/23_containers/map/modifiers/insert/4.cc: Likewise.
        * testsuite/23_containers/map/modifiers/insert/5.cc: Likewise.
        * testsuite/23_containers/map/element_access/2.cc: Likewise.
        * testsuite/23_containers/map/element_access/46148.cc: Likewise.

        * include/bits/hashtable.h: Trivial naming changes.

Added:
    trunk/libstdc++-v3/testsuite/23_containers/map/element_access/2.cc
    trunk/libstdc++-v3/testsuite/23_containers/map/element_access/46148.cc
    trunk/libstdc++-v3/testsuite/23_containers/map/modifiers/insert/2.cc
    trunk/libstdc++-v3/testsuite/23_containers/map/modifiers/insert/3.cc
    trunk/libstdc++-v3/testsuite/23_containers/map/modifiers/insert/4.cc
    trunk/libstdc++-v3/testsuite/23_containers/map/modifiers/insert/5.cc
    trunk/libstdc++-v3/testsuite/23_containers/multimap/modifiers/insert/1.cc
    trunk/libstdc++-v3/testsuite/23_containers/multimap/modifiers/insert/2.cc
    trunk/libstdc++-v3/testsuite/23_containers/multimap/modifiers/insert/3.cc
    trunk/libstdc++-v3/testsuite/23_containers/multimap/modifiers/insert/4.cc
    trunk/libstdc++-v3/testsuite/23_containers/multiset/modifiers/insert/3.cc
    trunk/libstdc++-v3/testsuite/23_containers/multiset/modifiers/insert/4.cc
    trunk/libstdc++-v3/testsuite/23_containers/set/modifiers/insert/2.cc
    trunk/libstdc++-v3/testsuite/23_containers/set/modifiers/insert/3.cc
Modified:
    trunk/libstdc++-v3/ChangeLog
    trunk/libstdc++-v3/include/bits/hashtable.h
    trunk/libstdc++-v3/include/bits/stl_map.h
    trunk/libstdc++-v3/include/bits/stl_multimap.h
    trunk/libstdc++-v3/include/bits/stl_multiset.h
    trunk/libstdc++-v3/include/bits/stl_set.h
    trunk/libstdc++-v3/include/bits/stl_tree.h
    trunk/libstdc++-v3/include/debug/map.h
    trunk/libstdc++-v3/include/debug/multimap.h
    trunk/libstdc++-v3/include/debug/multiset.h
    trunk/libstdc++-v3/include/debug/set.h
    trunk/libstdc++-v3/include/profile/map.h
    trunk/libstdc++-v3/include/profile/multimap.h
    trunk/libstdc++-v3/include/profile/multiset.h
    trunk/libstdc++-v3/include/profile/set.h
Comment 14 Paolo Carlini 2010-12-10 16:55:53 UTC
The insert* are done.
Comment 15 Kira Backes 2011-06-09 11:22:35 UTC
Half a year since the last comment has passed but I still can't use emplace and this means I can't use unique_ptr in a map (or can I?).

Is it really so hard to code emplace methods? Can we somehow help?



rgds, Kira
Comment 16 Paolo Carlini 2011-06-09 11:30:42 UTC
I don't see what the emplace members have to do with unique_ptr. Anyway, I'm working on something else at the moment, contributions are always welcome, just file a Copyright Assignment and send over patches, thanks in advance!
Comment 17 Paolo Carlini 2011-06-09 11:46:12 UTC
Eg, this works perfectly well already, since I added the insert members:

  set<unique_ptr<int>> s;
  unique_ptr<int> up;
  s.insert(std::move(up));
Comment 18 Jonathan Wakely 2011-06-09 11:51:34 UTC
(In reply to comment #15)
> Is it really so hard to code emplace methods? Can we somehow help?

It's not so hard, but we have limited resources and other priorities.

Patches welcome, see
http://gcc.gnu.org/onlinedocs/libstdc++/manual/appendix_contributing.html
Comment 19 Kira Backes 2011-06-09 11:59:29 UTC
Because the usual add functions would have to copy the unique_ptr and that doesn't work. As I see it in a map there are only insert functions for pairs. So if this works I'd have to create a pair and then use the created pair to insert it into the map, I'm gonna test it. But it would double the code size.

As I understand it the emplace is just like an alias that forwards the 2 parameters into a pair constructor and inserts it afterwards.



rgds, Kira
Comment 20 Paolo Carlini 2011-06-09 12:08:01 UTC
For sure the rationale behind emplace isn't inserting a pair of unique_ptrs in a map: maybe it can be a little more convenient in terms of lines of user code, but isn't the reason emplace exists.
Comment 21 Kira Backes 2011-06-09 12:21:07 UTC
Hi,



I don't mean a pair of unique_ptr, just any combination with a unique_ptr.

I for example very often need:

std::map<uint32_t, unique_ptr<User>> instancesByIds_;


Now if I want to insert a User, with a shared_ptr I'd have to do:

instancesByIds_[id] = user;


Now with a unique_ptr I'd like to do the same:


instancesByIds_[id] = user;
instancesByIds_[id] = std::move(user);

Both doesnt work. Emplace is the practical solution (please correct me if there's a better way):


instancesByIds_.emplace(id, std::move(user));



rgds, Kira
Comment 22 Jonathan Wakely 2011-06-09 12:25:15 UTC
(In reply to comment #21)
> Now with a unique_ptr I'd like to do the same:
> 
> 
> instancesByIds_[id] = user;
> instancesByIds_[id] = std::move(user);
> 
> Both doesnt work.

Nonsense. The second one works fine.

This works too:

instancesByIds_.insert(make_pair(id, std::move(user)));
Comment 23 Kira Backes 2011-06-09 12:27:31 UTC
(In reply to comment #22)
> Nonsense. The second one works fine.

Nope, it really doesn't! Or was this fixed in GCC 4.6.0 (I'm on 4.5.0 and this bug report is tagged to 4.5.0)

Do you just claim this to work or did you actually test this?



rgds, Kira
Comment 24 Jonathan Wakely 2011-06-09 12:35:15 UTC
I tested it. It works.


Just because the PR was reported against 4.5 doesn't mean it'll be fixed in that release series. Note there's no Target Milestone set for this PR.  I can assure you the emplace member are not going to be added to GCC 4.5 so even when this is resolved you'll need to upgrade to use them.

If you want to use the experimental C++0x support you really need to use an up-to-date release, complaining about lack of features in old releases is a waste of time, the 4.5 branch is only open for fixing regressions and updating documentation:
http://gcc.gnu.org/ml/gcc/2011-04/msg00412.html
Comment 25 Kira Backes 2011-06-09 12:41:42 UTC
I'm sorry, don't misunderstand me, I'm willing to upgrade. I'm right now upgrading to 4.6

When I googled for this problem a year ago I've read that the second line doesn't work by *specification* and that you *have* to use emplace. I apologize for believing that crap (or maybe it was correct back then and the specification has been improved).


Thanks for your help! :-)



rgds, Kira
Comment 26 Haakan Younes 2011-06-09 13:03:19 UTC
(In reply to comment #18)
> (In reply to comment #15)
> > Is it really so hard to code emplace methods? Can we somehow help?
> 
> It's not so hard, but we have limited resources and other priorities.
> 
> Patches welcome, see
> http://gcc.gnu.org/onlinedocs/libstdc++/manual/appendix_contributing.html

I started looking into it about a year ago, before you added insert(&&).  It
seems easy enough to add emplace for map, but what about set?

For map, the first argument to emplace is going to be the key (I believe).  We can therefore determine if the key is already present in the map before we
construct the value object from the remaining arguments to emplace.

For set, the key is the value, so I don't see a way to avoid constructing the
value object from the arguments to emplace before you know if it should be
inserted.

Am I thinking about it the wrong way?

BTW, I have been happily using insert(&&) for maps for at least 6 months (GCC
built from trunk).  I strongly suspect it is available with GCC 4.6.  You
definitely do not need emplace to store unique_ptr values in a map.
Comment 27 Jonathan Wakely 2011-06-09 13:13:36 UTC
(In reply to comment #25)
> When I googled for this problem a year ago I've read that the second line
> doesn't work by *specification* and that you *have* to use emplace.

No, that's never been true.

The type of instancesByIds_[id] is a reference to the mapped_type, i.e.
unique_ptr<User>& and you have always been able to move assign to a unique_ptr from an rvalue, by design.

You would have to use emplace for a container of objects which were not copyable *or* movable, but unique_ptr is movable.
Comment 28 Jonathan Wakely 2011-06-09 13:27:56 UTC
(In reply to comment #26)
> For map, the first argument to emplace is going to be the key (I believe).  We
> can therefore determine if the key is already present in the map before we
> construct the value object from the remaining arguments to emplace.

Not necessarily:

std::map<int, int> m;
m.emplace(piecewise_construct_t, make_tuple(1), make_tuple(2));
Comment 29 Nathan Ridge 2011-11-05 20:38:10 UTC
Should the entry for 23.2.4 on the Library Status page (http://gcc.gnu.org/onlinedocs/libstdc++/manual/status.html#status.iso.200x) not say "Partial" until this is implemented?
Comment 30 Jonathan Wakely 2011-11-06 00:29:39 UTC
Author: redi
Date: Sun Nov  6 00:29:36 2011
New Revision: 181022

URL: http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=181022
Log:
	PR libstdc++/44436
	* doc/xml/manual/status_cxx200x.xml: Document emplace members are
	missing.

Modified:
    trunk/libstdc++-v3/ChangeLog
    trunk/libstdc++-v3/doc/xml/manual/status_cxx200x.xml
Comment 31 Paolo Carlini 2011-12-11 10:31:11 UTC
Unordered containers done with this patch:

2011-12-09  François Dumont <fdumont@gcc.gnu.org>

	PR libstdc++/44436 (unordered containers emplace, emplace_hint bits)
	* include/bits/hashtable.h (_Hashtable<>::emplace,
	_Hashtable<>::emplace_hint): Add.
        ...
Comment 32 François Dumont 2012-09-24 19:53:46 UTC
Author: fdumont
Date: Mon Sep 24 19:53:36 2012
New Revision: 191679

URL: http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=191679
Log:
2012-09-24  François Dumont  <fdumont@gcc.gnu.org>

	PR libstdc++/44436
	* include/bits/stl_tree.h
	(_Rb_tree<>::_M_insert_): Take _Base_ptr rather than
	_Const_Base_ptr.
	(_Rb_tree<>::_M_insert_node): New.
	(_Rb_tree<>::_M_get_insert_unique_pos): New, search code of
	_M_insert_unique method.
	(_Rb_tree<>::_M_insert_unique): Use latter.
	(_Rb_tree<>::_M_emplace_unique): New, likewise.
	(_Rb_tree<>::_M_get_insert_equal_pos): New, search code of
	_M_insert_equal method.
	(_Rb_tree<>::_M_insert_equal): Use latter.
	(_Rb_tree<>::_M_emplace_equal): New, likewise.
	(_Rb_tree<>::_M_get_insert_hint_unique_pos): New, search code of
	_M_insert_unique_ method.
	(_Rb_tree<>::_M_insert_unique_): Use latter.
	(_Rb_tree<>::_M_emplace_hint_unique): New, likewise.
	(_Rb_tree<>::_M_get_insert_hint_equal_pos): New, search code of
	_M_insert_equal_ method.
	(_Rb_tree<>::_M_insert_equal_): Use latter.
	(_Rb_tree<>::_M_emplace_hint_equal): New, likewise.
	(_Rb_tree<>::_M_insert_lower): Remove first _Base_ptr parameter,
	useless as always null.
	* include/bits/stl_map.h: Include <tuple> in C++11.
	(map<>::operator[](const key_type&)): Use
	_Rb_tree<>::_M_emplace_hint_unique in C++11.
	(map<>::operator[](key_type&&)): Likewise.
	(map<>::emplace): New.
	(map<>::emplace_hint): New.
	* include/bits/stl_multimap.h (multimap<>::emplace): New.
	(multimap<>::emplace_hint): New.
	* include/bits/stl_set.h (set<>::emplace): New.
	(set<>::emplace_hint): New.
	* include/bits/stl_multiset.h (multiset<>::emplace): New.
	(multiset<>::emplace_hint): New.
	* include/debug/map.h (std::__debug::map<>::emplace): New.
	(std::__debug::map<>::emplace_hint): New.
	* include/debug/multimap.h (std::__debug::multimap<>::emplace):
	New.
	(std::__debug::multimap<>::emplace_hint): New.
	* include/debug/set.h (std::__debug::set<>::emplace): New.
	(std::__debug::set<>::emplace_hint): New.
	* include/debug/multiset.h (std::__debug::multiset<>::emplace):
	New.
	(std::__debug::multiset<>::emplace_hint): New.
	* include/profile/map.h (std::__profile::map<>::emplace): New.
	(std::__profile::map<>::emplace_hint): New.
	* include/profile/multimap.h (std::__profile::multimap<>::emplace):
	New.
	(std::__profile::multimap<>::emplace_hint): New.
	* include/profile/set.h (std::__profile::set<>::emplace): New.
	(std::__profile::set<>::emplace_hint): New.
	* include/profile/multiset.h (std::__profile::multiset<>::emplace):
	New.
	(std::__profile::multiset<>::emplace_hint): New.
	* testsuite/util/testsuite_container_traits.h: Signal that emplace
	and emplace_hint are available on std::map, std::multimap,
	std::set and std::multiset in C++11.
	* testsuite/23_containers/map/operators/2.cc: New.
	* testsuite/23_containers/map/modifiers/emplace/1.cc: New.
	* testsuite/23_containers/multimap/modifiers/emplace/1.cc: New.
	* testsuite/23_containers/set/modifiers/emplace/1.cc: New.
	* testsuite/23_containers/multiset/modifiers/emplace/1.cc: New.

Added:
    trunk/libstdc++-v3/testsuite/23_containers/map/modifiers/emplace/
    trunk/libstdc++-v3/testsuite/23_containers/map/modifiers/emplace/1.cc
    trunk/libstdc++-v3/testsuite/23_containers/map/operators/2.cc
    trunk/libstdc++-v3/testsuite/23_containers/multimap/modifiers/emplace/
    trunk/libstdc++-v3/testsuite/23_containers/multimap/modifiers/emplace/1.cc
    trunk/libstdc++-v3/testsuite/23_containers/multiset/modifiers/emplace/
    trunk/libstdc++-v3/testsuite/23_containers/multiset/modifiers/emplace/1.cc
    trunk/libstdc++-v3/testsuite/23_containers/set/modifiers/emplace/
    trunk/libstdc++-v3/testsuite/23_containers/set/modifiers/emplace/1.cc
Modified:
    trunk/libstdc++-v3/ChangeLog
    trunk/libstdc++-v3/include/bits/stl_map.h
    trunk/libstdc++-v3/include/bits/stl_multimap.h
    trunk/libstdc++-v3/include/bits/stl_multiset.h
    trunk/libstdc++-v3/include/bits/stl_set.h
    trunk/libstdc++-v3/include/bits/stl_tree.h
    trunk/libstdc++-v3/include/debug/map.h
    trunk/libstdc++-v3/include/debug/multimap.h
    trunk/libstdc++-v3/include/debug/multiset.h
    trunk/libstdc++-v3/include/debug/set.h
    trunk/libstdc++-v3/include/profile/map.h
    trunk/libstdc++-v3/include/profile/multimap.h
    trunk/libstdc++-v3/include/profile/multiset.h
    trunk/libstdc++-v3/include/profile/set.h
    trunk/libstdc++-v3/testsuite/util/testsuite_container_traits.h
Comment 33 paolo@gcc.gnu.org 2012-09-25 08:43:53 UTC
Author: paolo
Date: Tue Sep 25 08:43:38 2012
New Revision: 191695

URL: http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=191695
Log:
2012-09-25  Paolo Carlini  <paolo.carlini@oracle.com>

	* doc/xml/manual/status_cxx2011.xml: Update vs PR 44436.

Modified:
    trunk/libstdc++-v3/ChangeLog
    trunk/libstdc++-v3/doc/xml/manual/status_cxx2011.xml
Comment 34 Paolo Carlini 2012-09-25 08:46:26 UTC
Finally done.