[Sema] ArrayRef-ize ActOnBaseSpecifiers. NFC

llvm-svn: 256399
This commit is contained in:
Craig Topper 2015-12-24 23:58:20 +00:00
parent d4336e01d7
commit 6550a4b17e
7 changed files with 23 additions and 26 deletions

View File

@ -701,7 +701,7 @@ public:
} }
/// \brief Sets the base classes of this struct or class. /// \brief Sets the base classes of this struct or class.
void setBases(CXXBaseSpecifier const * const *Bases, unsigned NumBases); void setBases(ArrayRef<const CXXBaseSpecifier *> Bases);
/// \brief Retrieves the number of base classes of this class. /// \brief Retrieves the number of base classes of this class.
unsigned getNumBases() const { return data().NumBases; } unsigned getNumBases() const { return data().NumBases; }

View File

@ -5365,10 +5365,10 @@ public:
SourceLocation BaseLoc, SourceLocation BaseLoc,
SourceLocation EllipsisLoc); SourceLocation EllipsisLoc);
bool AttachBaseSpecifiers(CXXRecordDecl *Class, CXXBaseSpecifier **Bases, bool AttachBaseSpecifiers(CXXRecordDecl *Class,
unsigned NumBases); MutableArrayRef<CXXBaseSpecifier *> Bases);
void ActOnBaseSpecifiers(Decl *ClassDecl, CXXBaseSpecifier **Bases, void ActOnBaseSpecifiers(Decl *ClassDecl,
unsigned NumBases); MutableArrayRef<CXXBaseSpecifier *> Bases);
bool IsDerivedFrom(SourceLocation Loc, QualType Derived, QualType Base); bool IsDerivedFrom(SourceLocation Loc, QualType Derived, QualType Base);
bool IsDerivedFrom(SourceLocation Loc, QualType Derived, QualType Base, bool IsDerivedFrom(SourceLocation Loc, QualType Derived, QualType Base,

View File

@ -2073,7 +2073,7 @@ bool ASTNodeImporter::ImportDefinition(RecordDecl *From, RecordDecl *To,
EllipsisLoc)); EllipsisLoc));
} }
if (!Bases.empty()) if (!Bases.empty())
ToCXX->setBases(Bases.data(), Bases.size()); ToCXX->setBases(Bases);
} }
if (shouldForceImportDeclContext(Kind)) if (shouldForceImportDeclContext(Kind))

View File

@ -135,14 +135,13 @@ CXXRecordDecl::CreateDeserialized(const ASTContext &C, unsigned ID) {
} }
void void
CXXRecordDecl::setBases(CXXBaseSpecifier const * const *Bases, CXXRecordDecl::setBases(ArrayRef<const CXXBaseSpecifier *> Bases) {
unsigned NumBases) {
ASTContext &C = getASTContext(); ASTContext &C = getASTContext();
if (!data().Bases.isOffset() && data().NumBases > 0) if (!data().Bases.isOffset() && data().NumBases > 0)
C.Deallocate(data().getBases()); C.Deallocate(data().getBases());
if (NumBases) { if (!Bases.empty()) {
// C++ [dcl.init.aggr]p1: // C++ [dcl.init.aggr]p1:
// An aggregate is [...] a class with [...] no base classes [...]. // An aggregate is [...] a class with [...] no base classes [...].
data().Aggregate = false; data().Aggregate = false;
@ -158,9 +157,9 @@ CXXRecordDecl::setBases(CXXBaseSpecifier const * const *Bases,
// The virtual bases of this class. // The virtual bases of this class.
SmallVector<const CXXBaseSpecifier *, 8> VBases; SmallVector<const CXXBaseSpecifier *, 8> VBases;
data().Bases = new(C) CXXBaseSpecifier [NumBases]; data().Bases = new(C) CXXBaseSpecifier [Bases.size()];
data().NumBases = NumBases; data().NumBases = Bases.size();
for (unsigned i = 0; i < NumBases; ++i) { for (unsigned i = 0; i < Bases.size(); ++i) {
data().getBases()[i] = *Bases[i]; data().getBases()[i] = *Bases[i];
// Keep track of inherited vbases for this base class. // Keep track of inherited vbases for this base class.
const CXXBaseSpecifier *Base = Bases[i]; const CXXBaseSpecifier *Base = Bases[i];

View File

@ -1844,7 +1844,7 @@ void Parser::ParseBaseClause(Decl *ClassDecl) {
} }
// Attach the base specifiers // Attach the base specifiers
Actions.ActOnBaseSpecifiers(ClassDecl, BaseInfo.data(), BaseInfo.size()); Actions.ActOnBaseSpecifiers(ClassDecl, BaseInfo);
} }
/// ParseBaseSpecifier - Parse a C++ base-specifier. A base-specifier is /// ParseBaseSpecifier - Parse a C++ base-specifier. A base-specifier is

View File

@ -1553,9 +1553,9 @@ NoteIndirectBases(ASTContext &Context, IndirectBaseSet &Set,
/// \brief Performs the actual work of attaching the given base class /// \brief Performs the actual work of attaching the given base class
/// specifiers to a C++ class. /// specifiers to a C++ class.
bool Sema::AttachBaseSpecifiers(CXXRecordDecl *Class, CXXBaseSpecifier **Bases, bool Sema::AttachBaseSpecifiers(CXXRecordDecl *Class,
unsigned NumBases) { MutableArrayRef<CXXBaseSpecifier *> Bases) {
if (NumBases == 0) if (Bases.empty())
return false; return false;
// Used to keep track of which base types we have already seen, so // Used to keep track of which base types we have already seen, so
@ -1571,7 +1571,7 @@ bool Sema::AttachBaseSpecifiers(CXXRecordDecl *Class, CXXBaseSpecifier **Bases,
// Copy non-redundant base specifiers into permanent storage. // Copy non-redundant base specifiers into permanent storage.
unsigned NumGoodBases = 0; unsigned NumGoodBases = 0;
bool Invalid = false; bool Invalid = false;
for (unsigned idx = 0; idx < NumBases; ++idx) { for (unsigned idx = 0; idx < Bases.size(); ++idx) {
QualType NewBaseType QualType NewBaseType
= Context.getCanonicalType(Bases[idx]->getType()); = Context.getCanonicalType(Bases[idx]->getType());
NewBaseType = NewBaseType.getLocalUnqualifiedType(); NewBaseType = NewBaseType.getLocalUnqualifiedType();
@ -1597,7 +1597,7 @@ bool Sema::AttachBaseSpecifiers(CXXRecordDecl *Class, CXXBaseSpecifier **Bases,
Bases[NumGoodBases++] = Bases[idx]; Bases[NumGoodBases++] = Bases[idx];
// Note this base's direct & indirect bases, if there could be ambiguity. // Note this base's direct & indirect bases, if there could be ambiguity.
if (NumBases > 1) if (Bases.size() > 1)
NoteIndirectBases(Context, IndirectBaseTypes, NewBaseType); NoteIndirectBases(Context, IndirectBaseTypes, NewBaseType);
if (const RecordType *Record = NewBaseType->getAs<RecordType>()) { if (const RecordType *Record = NewBaseType->getAs<RecordType>()) {
@ -1619,7 +1619,7 @@ bool Sema::AttachBaseSpecifiers(CXXRecordDecl *Class, CXXBaseSpecifier **Bases,
} }
// Attach the remaining base class specifiers to the derived class. // Attach the remaining base class specifiers to the derived class.
Class->setBases(Bases, NumGoodBases); Class->setBases(Bases.slice(0, NumGoodBases));
for (unsigned idx = 0; idx < NumGoodBases; ++idx) { for (unsigned idx = 0; idx < NumGoodBases; ++idx) {
// Check whether this direct base is inaccessible due to ambiguity. // Check whether this direct base is inaccessible due to ambiguity.
@ -1654,13 +1654,13 @@ bool Sema::AttachBaseSpecifiers(CXXRecordDecl *Class, CXXBaseSpecifier **Bases,
/// ActOnBaseSpecifiers - Attach the given base specifiers to the /// ActOnBaseSpecifiers - Attach the given base specifiers to the
/// class, after checking whether there are any duplicate base /// class, after checking whether there are any duplicate base
/// classes. /// classes.
void Sema::ActOnBaseSpecifiers(Decl *ClassDecl, CXXBaseSpecifier **Bases, void Sema::ActOnBaseSpecifiers(Decl *ClassDecl,
unsigned NumBases) { MutableArrayRef<CXXBaseSpecifier *> Bases) {
if (!ClassDecl || !Bases || !NumBases) if (!ClassDecl || Bases.empty())
return; return;
AdjustDeclIfTemplate(ClassDecl); AdjustDeclIfTemplate(ClassDecl);
AttachBaseSpecifiers(cast<CXXRecordDecl>(ClassDecl), Bases, NumBases); AttachBaseSpecifiers(cast<CXXRecordDecl>(ClassDecl), Bases);
} }
/// \brief Determine whether the type \p Derived is a C++ class that is /// \brief Determine whether the type \p Derived is a C++ class that is

View File

@ -1837,9 +1837,7 @@ Sema::SubstBaseSpecifiers(CXXRecordDecl *Instantiation,
Invalid = true; Invalid = true;
} }
if (!Invalid && if (!Invalid && AttachBaseSpecifiers(Instantiation, InstantiatedBases))
AttachBaseSpecifiers(Instantiation, InstantiatedBases.data(),
InstantiatedBases.size()))
Invalid = true; Invalid = true;
return Invalid; return Invalid;