aboutsummaryrefslogtreecommitdiff
path: root/llvm/unittests/Support/Path.cpp
diff options
context:
space:
mode:
authorJustin Bogner <mail@justinbogner.com>2014-08-04 17:36:41 +0000
committerJustin Bogner <mail@justinbogner.com>2014-08-04 17:36:41 +0000
commit487e764b584ddc5954e8acbaaf3552fcc5d8b303 (patch)
treea25c940b36d9545f5f8dccd72f56e9f6b4211a75 /llvm/unittests/Support/Path.cpp
parent90ba0533cd5698839181478140d6be89bfa4b13c (diff)
downloadllvm-487e764b584ddc5954e8acbaaf3552fcc5d8b303.zip
llvm-487e764b584ddc5954e8acbaaf3552fcc5d8b303.tar.gz
llvm-487e764b584ddc5954e8acbaaf3552fcc5d8b303.tar.bz2
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. llvm-svn: 214737
Diffstat (limited to 'llvm/unittests/Support/Path.cpp')
-rw-r--r--llvm/unittests/Support/Path.cpp6
1 files changed, 3 insertions, 3 deletions
diff --git a/llvm/unittests/Support/Path.cpp b/llvm/unittests/Support/Path.cpp
index db85347..bb1428f 100644
--- a/llvm/unittests/Support/Path.cpp
+++ b/llvm/unittests/Support/Path.cpp
@@ -141,7 +141,7 @@ TEST(Support, Path) {
StringRef filename(temp_store.begin(), temp_store.size()), stem, ext;
stem = path::stem(filename);
ext = path::extension(filename);
- EXPECT_EQ(*(--sys::path::end(filename)), (stem + ext).str());
+ EXPECT_EQ(*sys::path::rbegin(filename), (stem + ext).str());
path::native(*i, temp_store);
}
@@ -227,7 +227,7 @@ TEST(Support, AbsolutePathIteratorEnd) {
#endif
for (StringRef Path : Paths) {
- StringRef LastComponent = *--path::end(Path);
+ StringRef LastComponent = *path::rbegin(Path);
EXPECT_EQ(".", LastComponent);
}
@@ -239,7 +239,7 @@ TEST(Support, AbsolutePathIteratorEnd) {
#endif
for (StringRef Path : RootPaths) {
- StringRef LastComponent = *--path::end(Path);
+ StringRef LastComponent = *path::rbegin(Path);
EXPECT_EQ(1u, LastComponent.size());
EXPECT_TRUE(path::is_separator(LastComponent[0]));
}