https://gcc.gnu.org/bugzilla/show_bug.cgi?id=64814
            Bug ID: 64814
           Summary: std::copy_n advances InputIterator one *less* time
                    than necessary.
           Product: gcc
           Version: 4.9.2
            Status: UNCONFIRMED
          Severity: major
          Priority: P3
         Component: libstdc++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: alex-j-a at hotmail dot co.uk

Bug 50119 is related. The issue should be clear from the example below; I've
confirmed the output on several web-based compilers (I'm using a chromebook in
standard config) all of which claim to use GCC. 

minimal failing example:
#include <iostream>
#include <sstream>
#include <algorithm>
#include <iterator>
#include <string>

int main() {
    std::istringstream ss("123456789012");
    std::string output;

    auto readIter = std::istreambuf_iterator<char>(ss);
    for (int i = 0; i < 3; ++i) {
        output.clear();
        auto inserter = std::back_inserter(output);
        // Works - outputs 123456789012
        //for (int j = 0; j < 4; ++j)
        //    *inserter++ = *readIter++;

        // Doesn't work - outputs 123445677890
        std::copy_n(readIter, 4, inserter);

        std::cout << output;
    }
}

The following works perfectly as a drop-in replacement from my tests:
template <typename InputIt, typename SizeT, typename OutputIt>
OutputIt copy_n(InputIt first, SizeT count, OutputIt result) {
    for (; count > 0; --count)
        *result++ = *first++;
    return result;
}

Reply via email to