[libcxx] Avoid intermediate string objects for substrings in windows operator/=
Check that appends with a path object doesn't do allocations, even
on windows.
Suggested by Marek in D98398. The patch might apply without D98398
(depending on how much of the diff context has to match), but doesn't
make much sense until after that patch has landed.
Differential Revision: https://reviews.llvm.org/D98412
GitOrigin-RevId: 49173ca4db21e4d1576c2440b79ebff48c6c4156
diff --git a/include/filesystem b/include/filesystem
index 372b28f..dc4ac6d 100644
--- a/include/filesystem
+++ b/include/filesystem
@@ -1026,12 +1026,12 @@
if (__p.has_root_directory()) {
path __root_name_str = root_name();
__pn_ = __root_name_str.native();
- __pn_ += __p.__pn_.substr(__p_root_name_size);
+ __pn_ += __string_view(__p.__pn_).substr(__p_root_name_size);
return *this;
}
if (has_filename() || (!has_root_directory() && is_absolute()))
__pn_ += preferred_separator;
- __pn_ += __p.__pn_.substr(__p_root_name_size);
+ __pn_ += __string_view(__p.__pn_).substr(__p_root_name_size);
return *this;
}
template <class _Source>
diff --git a/test/std/input.output/filesystems/class.path/path.member/path.append.pass.cpp b/test/std/input.output/filesystems/class.path/path.member/path.append.pass.cpp
index 661ebac..d7fdc30 100644
--- a/test/std/input.output/filesystems/class.path/path.member/path.append.pass.cpp
+++ b/test/std/input.output/filesystems/class.path/path.member/path.append.pass.cpp
@@ -175,6 +175,15 @@
}
assert(PathEq(LHS, E));
}
+ {
+ path LHS(L); PathReserve(LHS, ReserveSize);
+ path RHS(R);
+ {
+ DisableAllocationGuard g;
+ LHS /= RHS;
+ }
+ assert(PathEq(LHS, E));
+ }
// input iterator - For non-native char types, appends needs to copy the
// iterator range into a contiguous block of memory before it can perform the
// code_cvt conversions.