forked from OSchip/llvm-project
[Sema] ArrayRef-ize ActOnBaseSpecifiers. NFC
llvm-svn: 256399
This commit is contained in:
parent
d4336e01d7
commit
6550a4b17e
|
@ -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; }
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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))
|
||||||
|
|
|
@ -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];
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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;
|
||||||
|
|
Loading…
Reference in New Issue