1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-11-25 12:12:47 +01:00

ADT: Use 'using' to inherit assign and append in SmallString

Rather than reimplement, use a `using` declaration to bring in
`SmallVectorImpl<char>`'s assign and append implementations in
`SmallString`.

The `SmallString` versions were missing reference invalidation
assertions from `SmallVector`. This patch also fixes a bug in
`llvm::FileCollector::addFileImpl`, which was a copy/paste from
`clang::ModuleDependencyCollector::copyToRoot`, both caught by the
no-longer-skipped assertions.

As a drive-by, this also sinks the `const SmallVectorImpl&` versions of
these methods down into `SmallVectorImpl`, since I imagine they'd be
useful elsewhere.

Differential Revision: https://reviews.llvm.org/D95202
This commit is contained in:
Duncan P. N. Exon Smith 2021-01-21 16:53:26 -08:00
parent e27b35d042
commit e675c8ca11
4 changed files with 29 additions and 39 deletions

View File

@ -40,35 +40,15 @@ public:
template<typename ItTy> template<typename ItTy>
SmallString(ItTy S, ItTy E) : SmallVector<char, InternalLen>(S, E) {} SmallString(ItTy S, ItTy E) : SmallVector<char, InternalLen>(S, E) {}
// Note that in order to add new overloads for append & assign, we have to
// duplicate the inherited versions so as not to inadvertently hide them.
/// @} /// @}
/// @name String Assignment /// @name String Assignment
/// @{ /// @{
/// Assign from a repeated element. using SmallVector<char, InternalLen>::assign;
void assign(size_t NumElts, char Elt) {
this->SmallVectorImpl<char>::assign(NumElts, Elt);
}
/// Assign from an iterator pair.
template<typename in_iter>
void assign(in_iter S, in_iter E) {
this->clear();
SmallVectorImpl<char>::append(S, E);
}
/// Assign from a StringRef. /// Assign from a StringRef.
void assign(StringRef RHS) { void assign(StringRef RHS) {
this->clear(); SmallVectorImpl<char>::assign(RHS.begin(), RHS.end());
SmallVectorImpl<char>::append(RHS.begin(), RHS.end());
}
/// Assign from a SmallVector.
void assign(const SmallVectorImpl<char> &RHS) {
this->clear();
SmallVectorImpl<char>::append(RHS.begin(), RHS.end());
} }
/// Assign from a list of StringRefs. /// Assign from a list of StringRefs.
@ -81,26 +61,13 @@ public:
/// @name String Concatenation /// @name String Concatenation
/// @{ /// @{
/// Append from an iterator pair. using SmallVector<char, InternalLen>::append;
template<typename in_iter>
void append(in_iter S, in_iter E) {
SmallVectorImpl<char>::append(S, E);
}
void append(size_t NumInputs, char Elt) {
SmallVectorImpl<char>::append(NumInputs, Elt);
}
/// Append from a StringRef. /// Append from a StringRef.
void append(StringRef RHS) { void append(StringRef RHS) {
SmallVectorImpl<char>::append(RHS.begin(), RHS.end()); SmallVectorImpl<char>::append(RHS.begin(), RHS.end());
} }
/// Append from a SmallVector.
void append(const SmallVectorImpl<char> &RHS) {
SmallVectorImpl<char>::append(RHS.begin(), RHS.end());
}
/// Append from a list of StringRefs. /// Append from a list of StringRefs.
void append(std::initializer_list<StringRef> Refs) { void append(std::initializer_list<StringRef> Refs) {
size_t SizeNeeded = this->size(); size_t SizeNeeded = this->size();

View File

@ -664,6 +664,8 @@ public:
append(IL.begin(), IL.end()); append(IL.begin(), IL.end());
} }
void append(const SmallVectorImpl &RHS) { append(RHS.begin(), RHS.end()); }
void assign(size_type NumElts, ValueParamT Elt) { void assign(size_type NumElts, ValueParamT Elt) {
// Note that Elt could be an internal reference. // Note that Elt could be an internal reference.
if (NumElts > this->capacity()) { if (NumElts > this->capacity()) {
@ -698,6 +700,8 @@ public:
append(IL); append(IL);
} }
void assign(const SmallVectorImpl &RHS) { assign(RHS.begin(), RHS.end()); }
iterator erase(const_iterator CI) { iterator erase(const_iterator CI) {
// Just cast away constness because this is a non-const member function. // Just cast away constness because this is a non-const member function.
iterator I = const_cast<iterator>(CI); iterator I = const_cast<iterator>(CI);

View File

@ -86,17 +86,18 @@ void FileCollector::addFileImpl(StringRef SrcPath) {
sys::path::native(AbsoluteSrc); sys::path::native(AbsoluteSrc);
// Remove redundant leading "./" pieces and consecutive separators. // Remove redundant leading "./" pieces and consecutive separators.
AbsoluteSrc = sys::path::remove_leading_dotslash(AbsoluteSrc); StringRef TrimmedAbsoluteSrc =
sys::path::remove_leading_dotslash(AbsoluteSrc);
// Canonicalize the source path by removing "..", "." components. // Canonicalize the source path by removing "..", "." components.
SmallString<256> VirtualPath = AbsoluteSrc; SmallString<256> VirtualPath = TrimmedAbsoluteSrc;
sys::path::remove_dots(VirtualPath, /*remove_dot_dot=*/true); sys::path::remove_dots(VirtualPath, /*remove_dot_dot=*/true);
// If a ".." component is present after a symlink component, remove_dots may // If a ".." component is present after a symlink component, remove_dots may
// lead to the wrong real destination path. Let the source be canonicalized // lead to the wrong real destination path. Let the source be canonicalized
// like that but make sure we always use the real path for the destination. // like that but make sure we always use the real path for the destination.
SmallString<256> CopyFrom; SmallString<256> CopyFrom;
if (!getRealPath(AbsoluteSrc, CopyFrom)) if (!getRealPath(TrimmedAbsoluteSrc, CopyFrom))
CopyFrom = VirtualPath; CopyFrom = VirtualPath;
SmallString<256> DstPath = StringRef(Root); SmallString<256> DstPath = StringRef(Root);

View File

@ -485,6 +485,15 @@ TYPED_TEST(SmallVectorTest, AppendRepeatedNonForwardIterator) {
this->assertValuesInOrder(this->theVector, 3u, 1, 7, 7); this->assertValuesInOrder(this->theVector, 3u, 1, 7, 7);
} }
TYPED_TEST(SmallVectorTest, AppendSmallVector) {
SCOPED_TRACE("AppendSmallVector");
SmallVector<Constructable, 3> otherVector = {7, 7};
this->theVector.push_back(Constructable(1));
this->theVector.append(otherVector);
this->assertValuesInOrder(this->theVector, 3u, 1, 7, 7);
}
// Assign test // Assign test
TYPED_TEST(SmallVectorTest, AssignTest) { TYPED_TEST(SmallVectorTest, AssignTest) {
SCOPED_TRACE("AssignTest"); SCOPED_TRACE("AssignTest");
@ -513,6 +522,15 @@ TYPED_TEST(SmallVectorTest, AssignNonIterTest) {
this->assertValuesInOrder(this->theVector, 2u, 7, 7); this->assertValuesInOrder(this->theVector, 2u, 7, 7);
} }
TYPED_TEST(SmallVectorTest, AssignSmallVector) {
SCOPED_TRACE("AssignSmallVector");
SmallVector<Constructable, 3> otherVector = {7, 7};
this->theVector.push_back(Constructable(1));
this->theVector.assign(otherVector);
this->assertValuesInOrder(this->theVector, 2u, 7, 7);
}
// Move-assign test // Move-assign test
TYPED_TEST(SmallVectorTest, MoveAssignTest) { TYPED_TEST(SmallVectorTest, MoveAssignTest) {
SCOPED_TRACE("MoveAssignTest"); SCOPED_TRACE("MoveAssignTest");