mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-07-28 03:25:23 +00:00
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
This commit is contained in:
@@ -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]));
|
||||
}
|
||||
|
Reference in New Issue
Block a user