Ok, 3 major changes for debug mode in one commit:
authorHoward Hinnant <hhinnant@apple.com>
Fri, 2 Aug 2013 00:26:35 +0000 (00:26 +0000)
committerHoward Hinnant <hhinnant@apple.com>
Fri, 2 Aug 2013 00:26:35 +0000 (00:26 +0000)
commit42a3046eefdf86d762ab8a64642948a2bae93a05
treed337103e276cba4b87375ac7053829afb8381d9e
parent1c349ef7e81f572ea66403ac5c3fd7750bf64f61
Ok, 3 major changes for debug mode in one commit:

1.  I had been detecting and trapping iterator == and \!= among iterators
    in different containers as an error.  But the trapping itself is actually
    an error.

    Consider:

    #include <iostream>
    #include <vector>
    #include <algorithm>

    template <class C>
    void
    display(const C& c)
    {
        std::cout << "{";
        bool first = true;
        for (const auto& x : c)
        {
            if (\!first)
                std::cout << ", ";
            first = false;
            std::cout << x;
        }
        std::cout << "}\n";
    }

    int
    main()
    {
        typedef std::vector<int> V;
        V v1 = {1, 3, 5};
        V v2 = {2, 4, 6};
        display(v1);
        display(v2);
        V::iterator i = std::find(v1.begin(), v1.end(), 1);
        V::iterator j = std::find(v2.begin(), v2.end(), 2);
        if (*i == *j)
            i = j;    // perfectly legal
        // ...
        if (i \!= j)   // the only way to check
            v2.push_back(*i);
        display(v1);
        display(v2);
    }

    It is legal to assign an iterator from one container to another of the
    same type.  This is required to work.  One might want to test whether or
    not such an assignment had been made.  The way one performs such a check
    is using the iterator's ==, \!= operator.  This is a logical and necessary
    function and does not constitute an error.

2.  I had a header circular dependence bug when _LIBCPP_DEBUG2 is defined.
    This caused a problem in several of the libc++ tests.
    Fixed.

3.  There is a serious problem when _LIBCPP_DEBUG2=1 at the moment in that
    std::basic_string is inoperable.  std::basic_string uses __wrap_iterator
    to implement its iterators.  __wrap_iterator has been rigged up in debug
    mode to support vector.  But string hasn't been rigged up yet.  This means
    that one gets false positives when using std::string in debug mode.  I've
    upped std::string's priority in www/debug_mode.html.

llvm-svn: 187636
17 files changed:
libcxx/include/__config
libcxx/include/__debug
libcxx/include/__hash_table
libcxx/include/iterator
libcxx/include/list
libcxx/include/vector
libcxx/src/debug.cpp
libcxx/test/containers/sequences/list/db_iterators_1.pass.cpp [deleted file]
libcxx/test/containers/sequences/vector/db_iterators_1.pass.cpp [deleted file]
libcxx/test/containers/unord/unord.multimap/db_iterators_1.pass.cpp [deleted file]
libcxx/test/containers/unord/unord.multimap/db_local_iterators_1.pass.cpp [deleted file]
libcxx/test/containers/unord/unord.multiset/db_iterators_1.pass.cpp [deleted file]
libcxx/test/containers/unord/unord.multiset/db_local_iterators_1.pass.cpp [deleted file]
libcxx/test/containers/unord/unord.set/db_iterators_1.pass.cpp [deleted file]
libcxx/test/containers/unord/unord.set/db_local_iterators_1.pass.cpp [deleted file]
libcxx/test/re/re.alg/re.alg.match/awk.pass.cpp
libcxx/www/debug_mode.html