Path: Stop claiming path::const_iterator is bidirectional
authorJustin Bogner <mail@justinbogner.com>
Mon, 4 Aug 2014 17:36:41 +0000 (17:36 +0000)
committerJustin Bogner <mail@justinbogner.com>
Mon, 4 Aug 2014 17:36:41 +0000 (17:36 +0000)
commit981eb59138eea543af5fc628399480eb11d27016
tree5cc8a785d58d8a21eb43279ee481c063602bc9f9
parent93bbddf1f2bf7da1e0da513cf43dbeecb5c3cb2c
Path: Stop claiming path::const_iterator is bidirectional

path::const_iterator claims that it's a bidirectional iterator, but it
doesn't satisfy all of the contracts for a bidirectional iterator.
For example, n3376 24.2.5 p6 says "If a and b are both dereferenceable,
then a == b if and only if *a and *b are bound to the same object",
but this doesn't work with how we stash and recreate Components.

This means that our use of reverse_iterator on this type is invalid
and leads to many of the valgrind errors we're hitting, as explained
by Tilmann Scheller here:

    http://lists.cs.uiuc.edu/pipermail/llvm-commits/Week-of-Mon-20140728/228654.html

Instead, we admit that path::const_iterator is only an input_iterator,
and implement a second input_iterator for path::reverse_iterator (by
changing const_iterator::operator-- to reverse_iterator::operator++).
All of the uses of this just traverse once over the path in one
direction or the other anyway.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@214737 91177308-0d34-0410-b5e6-96231b3b80d8
include/llvm/Support/Path.h
lib/Support/Path.cpp
unittests/Support/Path.cpp