[cfe-dev] libc++: Should std::istringstream's move ctr be nothrow?
Andrew Parker
andrew.j.c.parker at gmail.com
Sun Aug 9 23:32:34 PDT 2015
When building and running the test:
std/input.output/string.streams/stringstream.cons/move2.pass.cpp
with MSVC I found the test was asserting. The crux of the issue is that a
vector resize isn't preserving the contents of the vector. Specifically:
We have a *std::vector<std::istringstream> vecis. *The test pushes a
default constructed *istringstream* into the vector. It then modifies that
element in place using the *back() *member of *vector* and then by calling
the *str()* member of *istringstream.* Things go wrong when the next
*push_back* happens. This causes the vector to resize and thus reallocate.
We eventually end up down the callstack in the
*__construct_backward(allocator_type&
__a, _Ptr __begin1, _Ptr __end1, _Ptr& __end2) *member of
*std::allocator_traits.
*This calls *move_if_noexcept* with template parameter
*std::istringstream&.*
The problem is that this template uses type traits to determine whether to
actualy move or just return a reference. The offending line is:
*!is_nothrow_move_constructible<_Tp>::value &&
is_copy_constructible<_Tp>::value,*
with *_Tp = **std::istringstream.*
The declaration of *std::istringstream *doesn't mark it's move ctr as
_NOEXCEPT so *is_nothrow_move_constructible *is false. This causes the
contents of the vector to be lost as *std::istringstream *isn't copy
constructable (N.B. There's another issue here as MSVC then picks the
default ctr *basic_istringstream(ios_base::openmode __wch) *to do the "copy
construct". I believe the build should fail. But this is for another
time).
So my question is, should *std::istringstream's* move ctr be marked
_NOEXCEPT? I'm not sure why this issue doesn't occur with Clang. Thoughts
welcomed. Is this some deficiency in MSVC? Is this a potential bug and
Clang is smart enough to determine *std::istringstream* is noexcept? Have
I missed a trick? :)
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20150810/77ad922f/attachment.html>
More information about the cfe-dev
mailing list