mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2025-02-06 09:33:13 +00:00
Renamed CXXBaseOrMemberInitializer to CXXCtorInitializer. This is both shorter,
more accurate, and makes it make sense for it to hold a delegating constructor call. llvm-svn: 123084
This commit is contained in:
parent
710dd5aebf
commit
1d7926502f
@ -1106,7 +1106,7 @@ public:
|
||||
}
|
||||
};
|
||||
|
||||
/// CXXBaseOrMemberInitializer - Represents a C++ base or member
|
||||
/// CXXCtorInitializer - Represents a C++ base or member
|
||||
/// initializer, which is part of a constructor initializer that
|
||||
/// initializes one non-static member variable or one base class. For
|
||||
/// example, in the following, both 'A(a)' and 'f(3.14159)' are member
|
||||
@ -1120,7 +1120,7 @@ public:
|
||||
/// B(A& a) : A(a), f(3.14159) { }
|
||||
/// };
|
||||
/// @endcode
|
||||
class CXXBaseOrMemberInitializer {
|
||||
class CXXCtorInitializer {
|
||||
/// \brief Either the base class name (stored as a TypeSourceInfo*), an normal
|
||||
/// field (FieldDecl) or an anonymous field (IndirectFieldDecl*) being
|
||||
/// initialized.
|
||||
@ -1156,50 +1156,34 @@ class CXXBaseOrMemberInitializer {
|
||||
/// object in memory.
|
||||
unsigned SourceOrderOrNumArrayIndices : 14;
|
||||
|
||||
CXXBaseOrMemberInitializer(ASTContext &Context,
|
||||
FieldDecl *Member, SourceLocation MemberLoc,
|
||||
SourceLocation L,
|
||||
Expr *Init,
|
||||
SourceLocation R,
|
||||
VarDecl **Indices,
|
||||
unsigned NumIndices);
|
||||
CXXCtorInitializer(ASTContext &Context, FieldDecl *Member,
|
||||
SourceLocation MemberLoc, SourceLocation L, Expr *Init,
|
||||
SourceLocation R, VarDecl **Indices, unsigned NumIndices);
|
||||
|
||||
public:
|
||||
/// CXXBaseOrMemberInitializer - Creates a new base-class initializer.
|
||||
/// CXXCtorInitializer - Creates a new base-class initializer.
|
||||
explicit
|
||||
CXXBaseOrMemberInitializer(ASTContext &Context,
|
||||
TypeSourceInfo *TInfo, bool IsVirtual,
|
||||
SourceLocation L,
|
||||
Expr *Init,
|
||||
SourceLocation R,
|
||||
SourceLocation EllipsisLoc);
|
||||
CXXCtorInitializer(ASTContext &Context, TypeSourceInfo *TInfo, bool IsVirtual,
|
||||
SourceLocation L, Expr *Init, SourceLocation R,
|
||||
SourceLocation EllipsisLoc);
|
||||
|
||||
/// CXXBaseOrMemberInitializer - Creates a new member initializer.
|
||||
/// CXXCtorInitializer - Creates a new member initializer.
|
||||
explicit
|
||||
CXXBaseOrMemberInitializer(ASTContext &Context,
|
||||
FieldDecl *Member, SourceLocation MemberLoc,
|
||||
SourceLocation L,
|
||||
Expr *Init,
|
||||
SourceLocation R);
|
||||
CXXCtorInitializer(ASTContext &Context, FieldDecl *Member,
|
||||
SourceLocation MemberLoc, SourceLocation L, Expr *Init,
|
||||
SourceLocation R);
|
||||
|
||||
explicit
|
||||
CXXBaseOrMemberInitializer(ASTContext &Context,
|
||||
IndirectFieldDecl *Member,
|
||||
SourceLocation MemberLoc,
|
||||
SourceLocation L,
|
||||
Expr *Init,
|
||||
SourceLocation R);
|
||||
CXXCtorInitializer(ASTContext &Context, IndirectFieldDecl *Member,
|
||||
SourceLocation MemberLoc, SourceLocation L, Expr *Init,
|
||||
SourceLocation R);
|
||||
|
||||
/// \brief Creates a new member initializer that optionally contains
|
||||
/// array indices used to describe an elementwise initialization.
|
||||
static CXXBaseOrMemberInitializer *Create(ASTContext &Context,
|
||||
FieldDecl *Member,
|
||||
SourceLocation MemberLoc,
|
||||
SourceLocation L,
|
||||
Expr *Init,
|
||||
SourceLocation R,
|
||||
VarDecl **Indices,
|
||||
unsigned NumIndices);
|
||||
static CXXCtorInitializer *Create(ASTContext &Context, FieldDecl *Member,
|
||||
SourceLocation MemberLoc, SourceLocation L,
|
||||
Expr *Init, SourceLocation R,
|
||||
VarDecl **Indices, unsigned NumIndices);
|
||||
|
||||
/// isBaseInitializer - Returns true when this initializer is
|
||||
/// initializing a base class.
|
||||
@ -1359,10 +1343,10 @@ class CXXConstructorDecl : public CXXMethodDecl {
|
||||
bool ImplicitlyDefined : 1;
|
||||
|
||||
/// Support for base and member initializers.
|
||||
/// BaseOrMemberInitializers - The arguments used to initialize the base
|
||||
/// CtorInitializers - The arguments used to initialize the base
|
||||
/// or member.
|
||||
CXXBaseOrMemberInitializer **BaseOrMemberInitializers;
|
||||
unsigned NumBaseOrMemberInitializers;
|
||||
CXXCtorInitializer **CtorInitializers;
|
||||
unsigned NumCtorInitializers;
|
||||
|
||||
CXXConstructorDecl(CXXRecordDecl *RD, const DeclarationNameInfo &NameInfo,
|
||||
QualType T, TypeSourceInfo *TInfo,
|
||||
@ -1371,7 +1355,7 @@ class CXXConstructorDecl : public CXXMethodDecl {
|
||||
: CXXMethodDecl(CXXConstructor, RD, NameInfo, T, TInfo, false,
|
||||
SC_None, isInline),
|
||||
IsExplicitSpecified(isExplicitSpecified), ImplicitlyDefined(false),
|
||||
BaseOrMemberInitializers(0), NumBaseOrMemberInitializers(0) {
|
||||
CtorInitializers(0), NumCtorInitializers(0) {
|
||||
setImplicit(isImplicitlyDeclared);
|
||||
}
|
||||
|
||||
@ -1414,23 +1398,23 @@ public:
|
||||
}
|
||||
|
||||
/// init_iterator - Iterates through the member/base initializer list.
|
||||
typedef CXXBaseOrMemberInitializer **init_iterator;
|
||||
typedef CXXCtorInitializer **init_iterator;
|
||||
|
||||
/// init_const_iterator - Iterates through the memberbase initializer list.
|
||||
typedef CXXBaseOrMemberInitializer * const * init_const_iterator;
|
||||
typedef CXXCtorInitializer * const * init_const_iterator;
|
||||
|
||||
/// init_begin() - Retrieve an iterator to the first initializer.
|
||||
init_iterator init_begin() { return BaseOrMemberInitializers; }
|
||||
init_iterator init_begin() { return CtorInitializers; }
|
||||
/// begin() - Retrieve an iterator to the first initializer.
|
||||
init_const_iterator init_begin() const { return BaseOrMemberInitializers; }
|
||||
init_const_iterator init_begin() const { return CtorInitializers; }
|
||||
|
||||
/// init_end() - Retrieve an iterator past the last initializer.
|
||||
init_iterator init_end() {
|
||||
return BaseOrMemberInitializers + NumBaseOrMemberInitializers;
|
||||
return CtorInitializers + NumCtorInitializers;
|
||||
}
|
||||
/// end() - Retrieve an iterator past the last initializer.
|
||||
init_const_iterator init_end() const {
|
||||
return BaseOrMemberInitializers + NumBaseOrMemberInitializers;
|
||||
return CtorInitializers + NumCtorInitializers;
|
||||
}
|
||||
|
||||
typedef std::reverse_iterator<init_iterator> init_reverse_iterator;
|
||||
@ -1452,16 +1436,16 @@ public:
|
||||
|
||||
/// getNumArgs - Determine the number of arguments used to
|
||||
/// initialize the member or base.
|
||||
unsigned getNumBaseOrMemberInitializers() const {
|
||||
return NumBaseOrMemberInitializers;
|
||||
unsigned getNumCtorInitializers() const {
|
||||
return NumCtorInitializers;
|
||||
}
|
||||
|
||||
void setNumBaseOrMemberInitializers(unsigned numBaseOrMemberInitializers) {
|
||||
NumBaseOrMemberInitializers = numBaseOrMemberInitializers;
|
||||
void setNumCtorInitializers(unsigned numCtorInitializers) {
|
||||
NumCtorInitializers = numCtorInitializers;
|
||||
}
|
||||
|
||||
void setBaseOrMemberInitializers(CXXBaseOrMemberInitializer ** initializers) {
|
||||
BaseOrMemberInitializers = initializers;
|
||||
void setCtorInitializers(CXXCtorInitializer ** initializers) {
|
||||
CtorInitializers = initializers;
|
||||
}
|
||||
/// isDefaultConstructor - Whether this constructor is a default
|
||||
/// constructor (C++ [class.ctor]p5), which can be used to
|
||||
|
@ -28,7 +28,7 @@ class ObjCProtocolDecl;
|
||||
class ObjCCategoryDecl;
|
||||
class ObjCPropertyDecl;
|
||||
class ObjCPropertyImplDecl;
|
||||
class CXXBaseOrMemberInitializer;
|
||||
class CXXCtorInitializer;
|
||||
|
||||
class ObjCListBase {
|
||||
void operator=(const ObjCListBase &); // DO NOT IMPLEMENT
|
||||
@ -1213,7 +1213,7 @@ class ObjCImplementationDecl : public ObjCImplDecl {
|
||||
ObjCInterfaceDecl *SuperClass;
|
||||
/// Support for ivar initialization.
|
||||
/// IvarInitializers - The arguments used to initialize the ivars
|
||||
CXXBaseOrMemberInitializer **IvarInitializers;
|
||||
CXXCtorInitializer **IvarInitializers;
|
||||
unsigned NumIvarInitializers;
|
||||
|
||||
/// true of class extension has at least one bitfield ivar.
|
||||
@ -1232,10 +1232,10 @@ public:
|
||||
ObjCInterfaceDecl *superDecl);
|
||||
|
||||
/// init_iterator - Iterates through the ivar initializer list.
|
||||
typedef CXXBaseOrMemberInitializer **init_iterator;
|
||||
typedef CXXCtorInitializer **init_iterator;
|
||||
|
||||
/// init_const_iterator - Iterates through the ivar initializer list.
|
||||
typedef CXXBaseOrMemberInitializer * const * init_const_iterator;
|
||||
typedef CXXCtorInitializer * const * init_const_iterator;
|
||||
|
||||
/// init_begin() - Retrieve an iterator to the first initializer.
|
||||
init_iterator init_begin() { return IvarInitializers; }
|
||||
@ -1260,7 +1260,7 @@ public:
|
||||
}
|
||||
|
||||
void setIvarInitializers(ASTContext &C,
|
||||
CXXBaseOrMemberInitializer ** initializers,
|
||||
CXXCtorInitializer ** initializers,
|
||||
unsigned numInitializers);
|
||||
|
||||
bool hasSynthBitfield() const { return HasSynthBitfield; }
|
||||
|
@ -215,7 +215,7 @@ public:
|
||||
/// be overridden for clients that need access to the name.
|
||||
///
|
||||
/// \returns false if the visitation was terminated early, true otherwise.
|
||||
bool TraverseConstructorInitializer(CXXBaseOrMemberInitializer *Init);
|
||||
bool TraverseConstructorInitializer(CXXCtorInitializer *Init);
|
||||
|
||||
// ---- Methods on Stmts ----
|
||||
|
||||
@ -600,7 +600,7 @@ bool RecursiveASTVisitor<Derived>::TraverseTemplateArguments(
|
||||
|
||||
template<typename Derived>
|
||||
bool RecursiveASTVisitor<Derived>::TraverseConstructorInitializer(
|
||||
CXXBaseOrMemberInitializer *Init) {
|
||||
CXXCtorInitializer *Init) {
|
||||
// FIXME: recurse on TypeLoc of the base initializer if isBaseInitializer()?
|
||||
if (Init->isWritten())
|
||||
TRY_TO(TraverseStmt(Init->getInit()));
|
||||
|
@ -34,7 +34,7 @@ namespace clang {
|
||||
class Expr;
|
||||
class FieldDecl;
|
||||
class VarDecl;
|
||||
class CXXBaseOrMemberInitializer;
|
||||
class CXXCtorInitializer;
|
||||
class CXXBaseSpecifier;
|
||||
class CXXBindTemporaryExpr;
|
||||
class CFG;
|
||||
@ -110,13 +110,13 @@ public:
|
||||
class CFGInitializer : public CFGElement {
|
||||
public:
|
||||
CFGInitializer() {}
|
||||
CFGInitializer(CXXBaseOrMemberInitializer* I)
|
||||
CFGInitializer(CXXCtorInitializer* I)
|
||||
: CFGElement(I, Initializer) {}
|
||||
|
||||
CXXBaseOrMemberInitializer* getInitializer() const {
|
||||
return static_cast<CXXBaseOrMemberInitializer*>(Data1.getPointer());
|
||||
CXXCtorInitializer* getInitializer() const {
|
||||
return static_cast<CXXCtorInitializer*>(Data1.getPointer());
|
||||
}
|
||||
operator CXXBaseOrMemberInitializer*() const { return getInitializer(); }
|
||||
operator CXXCtorInitializer*() const { return getInitializer(); }
|
||||
|
||||
static bool classof(const CFGElement *E) {
|
||||
return E->getKind() == Initializer;
|
||||
@ -492,7 +492,7 @@ public:
|
||||
Elements.push_back(CFGStmt(statement), C);
|
||||
}
|
||||
|
||||
void appendInitializer(CXXBaseOrMemberInitializer *initializer,
|
||||
void appendInitializer(CXXCtorInitializer *initializer,
|
||||
BumpVectorContext& C) {
|
||||
Elements.push_back(CFGInitializer(initializer), C);
|
||||
}
|
||||
|
@ -307,7 +307,7 @@ public:
|
||||
|
||||
class PostInitializer : public ProgramPoint {
|
||||
public:
|
||||
PostInitializer(const CXXBaseOrMemberInitializer *I,
|
||||
PostInitializer(const CXXCtorInitializer *I,
|
||||
const LocationContext *L)
|
||||
: ProgramPoint(I, PostInitializerKind, L) {}
|
||||
|
||||
|
@ -162,7 +162,7 @@ public:
|
||||
typedef Stmt StmtTy;
|
||||
typedef OpaquePtr<DeclGroupRef> DeclGroupPtrTy;
|
||||
typedef CXXBaseSpecifier BaseTy;
|
||||
typedef CXXBaseOrMemberInitializer MemInitTy;
|
||||
typedef CXXCtorInitializer MemInitTy;
|
||||
typedef NestedNameSpecifier CXXScopeTy;
|
||||
typedef TemplateParameterList TemplateParamsTy;
|
||||
typedef OpaquePtr<TemplateName> TemplateTy;
|
||||
|
@ -23,7 +23,7 @@
|
||||
|
||||
namespace clang {
|
||||
class Attr;
|
||||
class CXXBaseOrMemberInitializer;
|
||||
class CXXCtorInitializer;
|
||||
class CXXBaseSpecifier;
|
||||
class Decl;
|
||||
class DeclGroupRef;
|
||||
@ -417,7 +417,7 @@ namespace clang {
|
||||
template<> struct IsResultPtrLowBitFree<CXXBaseSpecifier*> {
|
||||
static const bool value = true;
|
||||
};
|
||||
template<> struct IsResultPtrLowBitFree<CXXBaseOrMemberInitializer*> {
|
||||
template<> struct IsResultPtrLowBitFree<CXXCtorInitializer*> {
|
||||
static const bool value = true;
|
||||
};
|
||||
|
||||
@ -430,7 +430,7 @@ namespace clang {
|
||||
typedef ActionResult<Stmt*> StmtResult;
|
||||
typedef ActionResult<ParsedType> TypeResult;
|
||||
typedef ActionResult<CXXBaseSpecifier*> BaseResult;
|
||||
typedef ActionResult<CXXBaseOrMemberInitializer*> MemInitResult;
|
||||
typedef ActionResult<CXXCtorInitializer*> MemInitResult;
|
||||
|
||||
typedef ActionResult<Decl*> DeclResult;
|
||||
typedef OpaquePtr<TemplateName> ParsedTemplateTy;
|
||||
|
@ -203,7 +203,7 @@ public:
|
||||
typedef OpaquePtr<QualType> TypeTy;
|
||||
typedef Attr AttrTy;
|
||||
typedef CXXBaseSpecifier BaseTy;
|
||||
typedef CXXBaseOrMemberInitializer MemInitTy;
|
||||
typedef CXXCtorInitializer MemInitTy;
|
||||
typedef Expr ExprTy;
|
||||
typedef Stmt StmtTy;
|
||||
typedef TemplateParameterList TemplateParamsTy;
|
||||
@ -2573,9 +2573,9 @@ public:
|
||||
CXXRecordDecl *ClassDecl,
|
||||
SourceLocation EllipsisLoc);
|
||||
|
||||
bool SetBaseOrMemberInitializers(CXXConstructorDecl *Constructor,
|
||||
CXXBaseOrMemberInitializer **Initializers,
|
||||
unsigned NumInitializers, bool AnyErrors);
|
||||
bool SetCtorInitializers(CXXConstructorDecl *Constructor,
|
||||
CXXCtorInitializer **Initializers,
|
||||
unsigned NumInitializers, bool AnyErrors);
|
||||
|
||||
void SetIvarInitializers(ObjCImplementationDecl *ObjCImplementation);
|
||||
|
||||
@ -4746,7 +4746,7 @@ public:
|
||||
void CodeCompleteNamespaceAliasDecl(Scope *S);
|
||||
void CodeCompleteOperatorName(Scope *S);
|
||||
void CodeCompleteConstructorInitializer(Decl *Constructor,
|
||||
CXXBaseOrMemberInitializer** Initializers,
|
||||
CXXCtorInitializer** Initializers,
|
||||
unsigned NumInitializers);
|
||||
|
||||
void CodeCompleteObjCAtDirective(Scope *S, Decl *ObjCImpDecl,
|
||||
|
@ -53,7 +53,7 @@ class Decl;
|
||||
class DeclContext;
|
||||
class NestedNameSpecifier;
|
||||
class CXXBaseSpecifier;
|
||||
class CXXBaseOrMemberInitializer;
|
||||
class CXXCtorInitializer;
|
||||
class GotoStmt;
|
||||
class LabelStmt;
|
||||
class MacroDefinition;
|
||||
@ -1098,10 +1098,10 @@ public:
|
||||
CXXBaseSpecifier ReadCXXBaseSpecifier(PerFileData &F,
|
||||
const RecordData &Record,unsigned &Idx);
|
||||
|
||||
/// \brief Read a CXXBaseOrMemberInitializer array.
|
||||
std::pair<CXXBaseOrMemberInitializer **, unsigned>
|
||||
ReadCXXBaseOrMemberInitializers(PerFileData &F,
|
||||
const RecordData &Record, unsigned &Idx);
|
||||
/// \brief Read a CXXCtorInitializer array.
|
||||
std::pair<CXXCtorInitializer **, unsigned>
|
||||
ReadCXXCtorInitializers(PerFileData &F, const RecordData &Record,
|
||||
unsigned &Idx);
|
||||
|
||||
/// \brief Read a source location from raw form.
|
||||
SourceLocation ReadSourceLocation(PerFileData &Module, unsigned Raw) {
|
||||
|
@ -41,7 +41,7 @@ class ASTContext;
|
||||
class ASTSerializationListener;
|
||||
class NestedNameSpecifier;
|
||||
class CXXBaseSpecifier;
|
||||
class CXXBaseOrMemberInitializer;
|
||||
class CXXCtorInitializer;
|
||||
class LabelStmt;
|
||||
class MacroDefinition;
|
||||
class MemorizeStatCalls;
|
||||
@ -482,10 +482,11 @@ public:
|
||||
/// \brief Emit a C++ base specifier.
|
||||
void AddCXXBaseSpecifier(const CXXBaseSpecifier &Base, RecordDataImpl &Record);
|
||||
|
||||
/// \brief Emit a CXXBaseOrMemberInitializer array.
|
||||
void AddCXXBaseOrMemberInitializers(
|
||||
const CXXBaseOrMemberInitializer * const *BaseOrMembers,
|
||||
unsigned NumBaseOrMembers, RecordDataImpl &Record);
|
||||
/// \brief Emit a CXXCtorInitializer array.
|
||||
void AddCXXCtorInitializers(
|
||||
const CXXCtorInitializer * const *CtorInitializers,
|
||||
unsigned NumCtorInitializers,
|
||||
RecordDataImpl &Record);
|
||||
|
||||
void AddCXXDefinitionData(const CXXRecordDecl *D, RecordDataImpl &Record);
|
||||
|
||||
|
@ -999,43 +999,46 @@ bool CXXMethodDecl::hasInlineBody() const {
|
||||
return CheckFn->hasBody(fn) && !fn->isOutOfLine();
|
||||
}
|
||||
|
||||
CXXBaseOrMemberInitializer::
|
||||
CXXBaseOrMemberInitializer(ASTContext &Context,
|
||||
TypeSourceInfo *TInfo, bool IsVirtual,
|
||||
SourceLocation L, Expr *Init, SourceLocation R,
|
||||
SourceLocation EllipsisLoc)
|
||||
CXXCtorInitializer::CXXCtorInitializer(ASTContext &Context,
|
||||
TypeSourceInfo *TInfo, bool IsVirtual,
|
||||
SourceLocation L, Expr *Init,
|
||||
SourceLocation R,
|
||||
SourceLocation EllipsisLoc)
|
||||
: BaseOrMember(TInfo), MemberOrEllipsisLocation(EllipsisLoc), Init(Init),
|
||||
LParenLoc(L), RParenLoc(R), IsVirtual(IsVirtual), IsWritten(false),
|
||||
SourceOrderOrNumArrayIndices(0)
|
||||
{
|
||||
}
|
||||
|
||||
CXXBaseOrMemberInitializer::
|
||||
CXXBaseOrMemberInitializer(ASTContext &Context,
|
||||
FieldDecl *Member, SourceLocation MemberLoc,
|
||||
SourceLocation L, Expr *Init, SourceLocation R)
|
||||
CXXCtorInitializer::CXXCtorInitializer(ASTContext &Context,
|
||||
FieldDecl *Member,
|
||||
SourceLocation MemberLoc,
|
||||
SourceLocation L, Expr *Init,
|
||||
SourceLocation R)
|
||||
: BaseOrMember(Member), MemberOrEllipsisLocation(MemberLoc), Init(Init),
|
||||
LParenLoc(L), RParenLoc(R), IsVirtual(false),
|
||||
IsWritten(false), SourceOrderOrNumArrayIndices(0)
|
||||
{
|
||||
}
|
||||
|
||||
CXXBaseOrMemberInitializer::
|
||||
CXXBaseOrMemberInitializer(ASTContext &Context,
|
||||
IndirectFieldDecl *Member, SourceLocation MemberLoc,
|
||||
SourceLocation L, Expr *Init, SourceLocation R)
|
||||
CXXCtorInitializer::CXXCtorInitializer(ASTContext &Context,
|
||||
IndirectFieldDecl *Member,
|
||||
SourceLocation MemberLoc,
|
||||
SourceLocation L, Expr *Init,
|
||||
SourceLocation R)
|
||||
: BaseOrMember(Member), MemberOrEllipsisLocation(MemberLoc), Init(Init),
|
||||
LParenLoc(L), RParenLoc(R), IsVirtual(false),
|
||||
IsWritten(false), SourceOrderOrNumArrayIndices(0)
|
||||
{
|
||||
}
|
||||
|
||||
CXXBaseOrMemberInitializer::
|
||||
CXXBaseOrMemberInitializer(ASTContext &Context,
|
||||
FieldDecl *Member, SourceLocation MemberLoc,
|
||||
SourceLocation L, Expr *Init, SourceLocation R,
|
||||
VarDecl **Indices,
|
||||
unsigned NumIndices)
|
||||
CXXCtorInitializer::CXXCtorInitializer(ASTContext &Context,
|
||||
FieldDecl *Member,
|
||||
SourceLocation MemberLoc,
|
||||
SourceLocation L, Expr *Init,
|
||||
SourceLocation R,
|
||||
VarDecl **Indices,
|
||||
unsigned NumIndices)
|
||||
: BaseOrMember(Member), MemberOrEllipsisLocation(MemberLoc), Init(Init),
|
||||
LParenLoc(L), RParenLoc(R), IsVirtual(false),
|
||||
IsWritten(false), SourceOrderOrNumArrayIndices(NumIndices)
|
||||
@ -1044,51 +1047,49 @@ CXXBaseOrMemberInitializer(ASTContext &Context,
|
||||
memcpy(MyIndices, Indices, NumIndices * sizeof(VarDecl *));
|
||||
}
|
||||
|
||||
CXXBaseOrMemberInitializer *
|
||||
CXXBaseOrMemberInitializer::Create(ASTContext &Context,
|
||||
FieldDecl *Member,
|
||||
SourceLocation MemberLoc,
|
||||
SourceLocation L,
|
||||
Expr *Init,
|
||||
SourceLocation R,
|
||||
VarDecl **Indices,
|
||||
unsigned NumIndices) {
|
||||
void *Mem = Context.Allocate(sizeof(CXXBaseOrMemberInitializer) +
|
||||
CXXCtorInitializer *CXXCtorInitializer::Create(ASTContext &Context,
|
||||
FieldDecl *Member,
|
||||
SourceLocation MemberLoc,
|
||||
SourceLocation L, Expr *Init,
|
||||
SourceLocation R,
|
||||
VarDecl **Indices,
|
||||
unsigned NumIndices) {
|
||||
void *Mem = Context.Allocate(sizeof(CXXCtorInitializer) +
|
||||
sizeof(VarDecl *) * NumIndices,
|
||||
llvm::alignOf<CXXBaseOrMemberInitializer>());
|
||||
return new (Mem) CXXBaseOrMemberInitializer(Context, Member, MemberLoc,
|
||||
llvm::alignOf<CXXCtorInitializer>());
|
||||
return new (Mem) CXXCtorInitializer(Context, Member, MemberLoc,
|
||||
L, Init, R, Indices, NumIndices);
|
||||
}
|
||||
|
||||
TypeLoc CXXBaseOrMemberInitializer::getBaseClassLoc() const {
|
||||
TypeLoc CXXCtorInitializer::getBaseClassLoc() const {
|
||||
if (isBaseInitializer())
|
||||
return BaseOrMember.get<TypeSourceInfo*>()->getTypeLoc();
|
||||
else
|
||||
return TypeLoc();
|
||||
}
|
||||
|
||||
Type *CXXBaseOrMemberInitializer::getBaseClass() {
|
||||
Type *CXXCtorInitializer::getBaseClass() {
|
||||
if (isBaseInitializer())
|
||||
return BaseOrMember.get<TypeSourceInfo*>()->getType().getTypePtr();
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
|
||||
const Type *CXXBaseOrMemberInitializer::getBaseClass() const {
|
||||
const Type *CXXCtorInitializer::getBaseClass() const {
|
||||
if (isBaseInitializer())
|
||||
return BaseOrMember.get<TypeSourceInfo*>()->getType().getTypePtr();
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
|
||||
SourceLocation CXXBaseOrMemberInitializer::getSourceLocation() const {
|
||||
SourceLocation CXXCtorInitializer::getSourceLocation() const {
|
||||
if (isAnyMemberInitializer())
|
||||
return getMemberLocation();
|
||||
|
||||
return getBaseClassLoc().getLocalSourceRange().getBegin();
|
||||
}
|
||||
|
||||
SourceRange CXXBaseOrMemberInitializer::getSourceRange() const {
|
||||
SourceRange CXXCtorInitializer::getSourceRange() const {
|
||||
return SourceRange(getSourceLocation(), getRParenLoc());
|
||||
}
|
||||
|
||||
|
@ -432,14 +432,14 @@ void DeclPrinter::VisitFunctionDecl(FunctionDecl *D) {
|
||||
if (D->hasAttr<NoReturnAttr>())
|
||||
Proto += " __attribute((noreturn))";
|
||||
if (CXXConstructorDecl *CDecl = dyn_cast<CXXConstructorDecl>(D)) {
|
||||
if (CDecl->getNumBaseOrMemberInitializers() > 0) {
|
||||
if (CDecl->getNumCtorInitializers() > 0) {
|
||||
Proto += " : ";
|
||||
Out << Proto;
|
||||
Proto.clear();
|
||||
for (CXXConstructorDecl::init_const_iterator B = CDecl->init_begin(),
|
||||
E = CDecl->init_end();
|
||||
B != E; ++B) {
|
||||
CXXBaseOrMemberInitializer * BMInitializer = (*B);
|
||||
CXXCtorInitializer * BMInitializer = (*B);
|
||||
if (B != CDecl->init_begin())
|
||||
Out << ", ";
|
||||
if (BMInitializer->isAnyMemberInitializer()) {
|
||||
|
@ -502,7 +502,7 @@ struct XMLDumper : public XMLDeclVisitor<XMLDumper>,
|
||||
// CXXDestructorDecl ?
|
||||
// CXXConversionDecl ?
|
||||
|
||||
void dispatch(CXXBaseOrMemberInitializer *Init) {
|
||||
void dispatch(CXXCtorInitializer *Init) {
|
||||
// TODO
|
||||
}
|
||||
|
||||
|
@ -340,7 +340,7 @@ private:
|
||||
CFGBlock *addStmt(Stmt *S) {
|
||||
return Visit(S, AddStmtChoice::AlwaysAdd);
|
||||
}
|
||||
CFGBlock *addInitializer(CXXBaseOrMemberInitializer *I);
|
||||
CFGBlock *addInitializer(CXXCtorInitializer *I);
|
||||
void addAutomaticObjDtors(LocalScope::const_iterator B,
|
||||
LocalScope::const_iterator E, Stmt* S);
|
||||
void addImplicitDtorsForDestructor(const CXXDestructorDecl *DD);
|
||||
@ -359,7 +359,7 @@ private:
|
||||
AddStmtChoice asc = AddStmtChoice::AlwaysAdd) {
|
||||
B->appendStmt(S, cfg->getBumpVectorContext());
|
||||
}
|
||||
void appendInitializer(CFGBlock *B, CXXBaseOrMemberInitializer *I) {
|
||||
void appendInitializer(CFGBlock *B, CXXCtorInitializer *I) {
|
||||
B->appendInitializer(I, cfg->getBumpVectorContext());
|
||||
}
|
||||
void appendBaseDtor(CFGBlock *B, const CXXBaseSpecifier *BS) {
|
||||
@ -526,7 +526,7 @@ CFGBlock* CFGBuilder::createBlock(bool add_successor) {
|
||||
}
|
||||
|
||||
/// addInitializer - Add C++ base or member initializer element to CFG.
|
||||
CFGBlock *CFGBuilder::addInitializer(CXXBaseOrMemberInitializer *I) {
|
||||
CFGBlock *CFGBuilder::addInitializer(CXXCtorInitializer *I) {
|
||||
if (!BuildOpts.AddInitializers)
|
||||
return Block;
|
||||
|
||||
@ -3050,7 +3050,7 @@ static void print_elem(llvm::raw_ostream &OS, StmtPrinterHelper* Helper,
|
||||
OS << '\n';
|
||||
|
||||
} else if (CFGInitializer IE = E.getAs<CFGInitializer>()) {
|
||||
CXXBaseOrMemberInitializer* I = IE;
|
||||
CXXCtorInitializer* I = IE;
|
||||
if (I->isBaseInitializer())
|
||||
OS << I->getBaseClass()->getAsCXXRecordDecl()->getName();
|
||||
else OS << I->getAnyMember()->getName();
|
||||
|
@ -363,7 +363,7 @@ static bool BaseInitializerUsesThis(ASTContext &C, const Expr *Init) {
|
||||
|
||||
static void EmitBaseInitializer(CodeGenFunction &CGF,
|
||||
const CXXRecordDecl *ClassDecl,
|
||||
CXXBaseOrMemberInitializer *BaseInit,
|
||||
CXXCtorInitializer *BaseInit,
|
||||
CXXCtorType CtorType) {
|
||||
assert(BaseInit->isBaseInitializer() &&
|
||||
"Must have base initializer!");
|
||||
@ -405,7 +405,7 @@ static void EmitBaseInitializer(CodeGenFunction &CGF,
|
||||
static void EmitAggMemberInitializer(CodeGenFunction &CGF,
|
||||
LValue LHS,
|
||||
llvm::Value *ArrayIndexVar,
|
||||
CXXBaseOrMemberInitializer *MemberInit,
|
||||
CXXCtorInitializer *MemberInit,
|
||||
QualType T,
|
||||
unsigned Index) {
|
||||
if (Index == MemberInit->getNumArrayIndices()) {
|
||||
@ -509,7 +509,7 @@ namespace {
|
||||
|
||||
static void EmitMemberInitializer(CodeGenFunction &CGF,
|
||||
const CXXRecordDecl *ClassDecl,
|
||||
CXXBaseOrMemberInitializer *MemberInit,
|
||||
CXXCtorInitializer *MemberInit,
|
||||
const CXXConstructorDecl *Constructor,
|
||||
FunctionArgList &Args) {
|
||||
assert(MemberInit->isAnyMemberInitializer() &&
|
||||
@ -531,7 +531,7 @@ static void EmitMemberInitializer(CodeGenFunction &CGF,
|
||||
LHS = CGF.EmitLValueForFieldInitialization(ThisPtr, Field, 0);
|
||||
}
|
||||
|
||||
// FIXME: If there's no initializer and the CXXBaseOrMemberInitializer
|
||||
// FIXME: If there's no initializer and the CXXCtorInitializer
|
||||
// was implicitly generated, we shouldn't be zeroing memory.
|
||||
RValue RHS;
|
||||
if (FieldType->isReferenceType()) {
|
||||
@ -707,12 +707,12 @@ void CodeGenFunction::EmitCtorPrologue(const CXXConstructorDecl *CD,
|
||||
FunctionArgList &Args) {
|
||||
const CXXRecordDecl *ClassDecl = CD->getParent();
|
||||
|
||||
llvm::SmallVector<CXXBaseOrMemberInitializer *, 8> MemberInitializers;
|
||||
llvm::SmallVector<CXXCtorInitializer *, 8> MemberInitializers;
|
||||
|
||||
for (CXXConstructorDecl::init_const_iterator B = CD->init_begin(),
|
||||
E = CD->init_end();
|
||||
B != E; ++B) {
|
||||
CXXBaseOrMemberInitializer *Member = (*B);
|
||||
CXXCtorInitializer *Member = (*B);
|
||||
|
||||
if (Member->isBaseInitializer())
|
||||
EmitBaseInitializer(*this, ClassDecl, Member, CtorType);
|
||||
|
@ -420,17 +420,17 @@ void CodeGenFunction::GenerateObjCSetter(ObjCImplementationDecl *IMP,
|
||||
void CodeGenFunction::GenerateObjCCtorDtorMethod(ObjCImplementationDecl *IMP,
|
||||
ObjCMethodDecl *MD,
|
||||
bool ctor) {
|
||||
llvm::SmallVector<CXXBaseOrMemberInitializer *, 8> IvarInitializers;
|
||||
llvm::SmallVector<CXXCtorInitializer *, 8> IvarInitializers;
|
||||
MD->createImplicitParams(CGM.getContext(), IMP->getClassInterface());
|
||||
StartObjCMethod(MD, IMP->getClassInterface());
|
||||
for (ObjCImplementationDecl::init_const_iterator B = IMP->init_begin(),
|
||||
E = IMP->init_end(); B != E; ++B) {
|
||||
CXXBaseOrMemberInitializer *Member = (*B);
|
||||
CXXCtorInitializer *Member = (*B);
|
||||
IvarInitializers.push_back(Member);
|
||||
}
|
||||
if (ctor) {
|
||||
for (unsigned I = 0, E = IvarInitializers.size(); I != E; ++I) {
|
||||
CXXBaseOrMemberInitializer *IvarInit = IvarInitializers[I];
|
||||
CXXCtorInitializer *IvarInit = IvarInitializers[I];
|
||||
FieldDecl *Field = IvarInit->getAnyMember();
|
||||
QualType FieldType = Field->getType();
|
||||
ObjCIvarDecl *Ivar = cast<ObjCIvarDecl>(Field);
|
||||
|
@ -1746,7 +1746,7 @@ void Parser::ParseConstructorInitializer(Decl *ConstructorDecl) {
|
||||
|
||||
SourceLocation ColonLoc = ConsumeToken();
|
||||
|
||||
llvm::SmallVector<CXXBaseOrMemberInitializer*, 4> MemInitializers;
|
||||
llvm::SmallVector<CXXCtorInitializer*, 4> MemInitializers;
|
||||
bool AnyErrors = false;
|
||||
|
||||
do {
|
||||
|
@ -3602,7 +3602,7 @@ void Sema::CodeCompleteOperatorName(Scope *S) {
|
||||
}
|
||||
|
||||
void Sema::CodeCompleteConstructorInitializer(Decl *ConstructorD,
|
||||
CXXBaseOrMemberInitializer** Initializers,
|
||||
CXXCtorInitializer** Initializers,
|
||||
unsigned NumInitializers) {
|
||||
CXXConstructorDecl *Constructor
|
||||
= static_cast<CXXConstructorDecl *>(ConstructorD);
|
||||
|
@ -1381,11 +1381,11 @@ Sema::BuildMemberInitializer(ValueDecl *Member, Expr **Args,
|
||||
}
|
||||
|
||||
if (DirectMember) {
|
||||
return new (Context) CXXBaseOrMemberInitializer(Context, DirectMember,
|
||||
return new (Context) CXXCtorInitializer(Context, DirectMember,
|
||||
IdLoc, LParenLoc, Init,
|
||||
RParenLoc);
|
||||
} else {
|
||||
return new (Context) CXXBaseOrMemberInitializer(Context, IndirectMember,
|
||||
return new (Context) CXXCtorInitializer(Context, IndirectMember,
|
||||
IdLoc, LParenLoc, Init,
|
||||
RParenLoc);
|
||||
}
|
||||
@ -1496,7 +1496,7 @@ Sema::BuildBaseInitializer(QualType BaseType, TypeSourceInfo *BaseTInfo,
|
||||
ExprTemporaries.begin() + ExprEvalContexts.back().NumTemporaries,
|
||||
ExprTemporaries.end());
|
||||
|
||||
return new (Context) CXXBaseOrMemberInitializer(Context, BaseTInfo,
|
||||
return new (Context) CXXCtorInitializer(Context, BaseTInfo,
|
||||
/*IsVirtual=*/false,
|
||||
LParenLoc,
|
||||
BaseInit.takeAs<Expr>(),
|
||||
@ -1551,7 +1551,7 @@ Sema::BuildBaseInitializer(QualType BaseType, TypeSourceInfo *BaseTInfo,
|
||||
ExprResult Init
|
||||
= Owned(new (Context) ParenListExpr(Context, LParenLoc, Args, NumArgs,
|
||||
RParenLoc));
|
||||
return new (Context) CXXBaseOrMemberInitializer(Context, BaseTInfo,
|
||||
return new (Context) CXXCtorInitializer(Context, BaseTInfo,
|
||||
BaseSpec->isVirtual(),
|
||||
LParenLoc,
|
||||
Init.takeAs<Expr>(),
|
||||
@ -1559,7 +1559,7 @@ Sema::BuildBaseInitializer(QualType BaseType, TypeSourceInfo *BaseTInfo,
|
||||
EllipsisLoc);
|
||||
}
|
||||
|
||||
return new (Context) CXXBaseOrMemberInitializer(Context, BaseTInfo,
|
||||
return new (Context) CXXCtorInitializer(Context, BaseTInfo,
|
||||
BaseSpec->isVirtual(),
|
||||
LParenLoc,
|
||||
BaseInit.takeAs<Expr>(),
|
||||
@ -1580,7 +1580,7 @@ BuildImplicitBaseInitializer(Sema &SemaRef, CXXConstructorDecl *Constructor,
|
||||
ImplicitInitializerKind ImplicitInitKind,
|
||||
CXXBaseSpecifier *BaseSpec,
|
||||
bool IsInheritedVirtualBase,
|
||||
CXXBaseOrMemberInitializer *&CXXBaseInit) {
|
||||
CXXCtorInitializer *&CXXBaseInit) {
|
||||
InitializedEntity InitEntity
|
||||
= InitializedEntity::InitializeBase(SemaRef.Context, BaseSpec,
|
||||
IsInheritedVirtualBase);
|
||||
@ -1636,7 +1636,7 @@ BuildImplicitBaseInitializer(Sema &SemaRef, CXXConstructorDecl *Constructor,
|
||||
return true;
|
||||
|
||||
CXXBaseInit =
|
||||
new (SemaRef.Context) CXXBaseOrMemberInitializer(SemaRef.Context,
|
||||
new (SemaRef.Context) CXXCtorInitializer(SemaRef.Context,
|
||||
SemaRef.Context.getTrivialTypeSourceInfo(BaseSpec->getType(),
|
||||
SourceLocation()),
|
||||
BaseSpec->isVirtual(),
|
||||
@ -1652,7 +1652,7 @@ static bool
|
||||
BuildImplicitMemberInitializer(Sema &SemaRef, CXXConstructorDecl *Constructor,
|
||||
ImplicitInitializerKind ImplicitInitKind,
|
||||
FieldDecl *Field,
|
||||
CXXBaseOrMemberInitializer *&CXXMemberInit) {
|
||||
CXXCtorInitializer *&CXXMemberInit) {
|
||||
if (Field->isInvalidDecl())
|
||||
return true;
|
||||
|
||||
@ -1751,7 +1751,7 @@ BuildImplicitMemberInitializer(Sema &SemaRef, CXXConstructorDecl *Constructor,
|
||||
return true;
|
||||
|
||||
CXXMemberInit
|
||||
= CXXBaseOrMemberInitializer::Create(SemaRef.Context, Field, Loc, Loc,
|
||||
= CXXCtorInitializer::Create(SemaRef.Context, Field, Loc, Loc,
|
||||
MemberInit.takeAs<Expr>(), Loc,
|
||||
IndexVariables.data(),
|
||||
IndexVariables.size());
|
||||
@ -1777,7 +1777,7 @@ BuildImplicitMemberInitializer(Sema &SemaRef, CXXConstructorDecl *Constructor,
|
||||
return true;
|
||||
|
||||
CXXMemberInit =
|
||||
new (SemaRef.Context) CXXBaseOrMemberInitializer(SemaRef.Context,
|
||||
new (SemaRef.Context) CXXCtorInitializer(SemaRef.Context,
|
||||
Field, Loc, Loc,
|
||||
MemberInit.get(),
|
||||
Loc);
|
||||
@ -1815,8 +1815,8 @@ struct BaseAndFieldInfo {
|
||||
CXXConstructorDecl *Ctor;
|
||||
bool AnyErrorsInInits;
|
||||
ImplicitInitializerKind IIK;
|
||||
llvm::DenseMap<const void *, CXXBaseOrMemberInitializer*> AllBaseFields;
|
||||
llvm::SmallVector<CXXBaseOrMemberInitializer*, 8> AllToInit;
|
||||
llvm::DenseMap<const void *, CXXCtorInitializer*> AllBaseFields;
|
||||
llvm::SmallVector<CXXCtorInitializer*, 8> AllToInit;
|
||||
|
||||
BaseAndFieldInfo(Sema &S, CXXConstructorDecl *Ctor, bool ErrorsInInits)
|
||||
: S(S), Ctor(Ctor), AnyErrorsInInits(ErrorsInInits) {
|
||||
@ -1833,7 +1833,7 @@ static bool CollectFieldInitializer(BaseAndFieldInfo &Info,
|
||||
FieldDecl *Top, FieldDecl *Field) {
|
||||
|
||||
// Overwhelmingly common case: we have a direct initializer for this field.
|
||||
if (CXXBaseOrMemberInitializer *Init = Info.AllBaseFields.lookup(Field)) {
|
||||
if (CXXCtorInitializer *Init = Info.AllBaseFields.lookup(Field)) {
|
||||
Info.AllToInit.push_back(Init);
|
||||
return false;
|
||||
}
|
||||
@ -1853,7 +1853,7 @@ static bool CollectFieldInitializer(BaseAndFieldInfo &Info,
|
||||
// First check for an explicit initializer for one field.
|
||||
for (RecordDecl::field_iterator FA = FieldClassDecl->field_begin(),
|
||||
EA = FieldClassDecl->field_end(); FA != EA; FA++) {
|
||||
if (CXXBaseOrMemberInitializer *Init = Info.AllBaseFields.lookup(*FA)) {
|
||||
if (CXXCtorInitializer *Init = Info.AllBaseFields.lookup(*FA)) {
|
||||
Info.AllToInit.push_back(Init);
|
||||
|
||||
// Once we've initialized a field of an anonymous union, the union
|
||||
@ -1887,7 +1887,7 @@ static bool CollectFieldInitializer(BaseAndFieldInfo &Info,
|
||||
if (Info.AnyErrorsInInits)
|
||||
return false;
|
||||
|
||||
CXXBaseOrMemberInitializer *Init = 0;
|
||||
CXXCtorInitializer *Init = 0;
|
||||
if (BuildImplicitMemberInitializer(Info.S, Info.Ctor, Info.IIK, Field, Init))
|
||||
return true;
|
||||
|
||||
@ -1898,20 +1898,20 @@ static bool CollectFieldInitializer(BaseAndFieldInfo &Info,
|
||||
}
|
||||
|
||||
bool
|
||||
Sema::SetBaseOrMemberInitializers(CXXConstructorDecl *Constructor,
|
||||
CXXBaseOrMemberInitializer **Initializers,
|
||||
Sema::SetCtorInitializers(CXXConstructorDecl *Constructor,
|
||||
CXXCtorInitializer **Initializers,
|
||||
unsigned NumInitializers,
|
||||
bool AnyErrors) {
|
||||
if (Constructor->getDeclContext()->isDependentContext()) {
|
||||
// Just store the initializers as written, they will be checked during
|
||||
// instantiation.
|
||||
if (NumInitializers > 0) {
|
||||
Constructor->setNumBaseOrMemberInitializers(NumInitializers);
|
||||
CXXBaseOrMemberInitializer **baseOrMemberInitializers =
|
||||
new (Context) CXXBaseOrMemberInitializer*[NumInitializers];
|
||||
Constructor->setNumCtorInitializers(NumInitializers);
|
||||
CXXCtorInitializer **baseOrMemberInitializers =
|
||||
new (Context) CXXCtorInitializer*[NumInitializers];
|
||||
memcpy(baseOrMemberInitializers, Initializers,
|
||||
NumInitializers * sizeof(CXXBaseOrMemberInitializer*));
|
||||
Constructor->setBaseOrMemberInitializers(baseOrMemberInitializers);
|
||||
NumInitializers * sizeof(CXXCtorInitializer*));
|
||||
Constructor->setCtorInitializers(baseOrMemberInitializers);
|
||||
}
|
||||
|
||||
return false;
|
||||
@ -1928,7 +1928,7 @@ Sema::SetBaseOrMemberInitializers(CXXConstructorDecl *Constructor,
|
||||
bool HadError = false;
|
||||
|
||||
for (unsigned i = 0; i < NumInitializers; i++) {
|
||||
CXXBaseOrMemberInitializer *Member = Initializers[i];
|
||||
CXXCtorInitializer *Member = Initializers[i];
|
||||
|
||||
if (Member->isBaseInitializer())
|
||||
Info.AllBaseFields[Member->getBaseClass()->getAs<RecordType>()] = Member;
|
||||
@ -1948,12 +1948,12 @@ Sema::SetBaseOrMemberInitializers(CXXConstructorDecl *Constructor,
|
||||
for (CXXRecordDecl::base_class_iterator VBase = ClassDecl->vbases_begin(),
|
||||
E = ClassDecl->vbases_end(); VBase != E; ++VBase) {
|
||||
|
||||
if (CXXBaseOrMemberInitializer *Value
|
||||
if (CXXCtorInitializer *Value
|
||||
= Info.AllBaseFields.lookup(VBase->getType()->getAs<RecordType>())) {
|
||||
Info.AllToInit.push_back(Value);
|
||||
} else if (!AnyErrors) {
|
||||
bool IsInheritedVirtualBase = !DirectVBases.count(VBase);
|
||||
CXXBaseOrMemberInitializer *CXXBaseInit;
|
||||
CXXCtorInitializer *CXXBaseInit;
|
||||
if (BuildImplicitBaseInitializer(*this, Constructor, Info.IIK,
|
||||
VBase, IsInheritedVirtualBase,
|
||||
CXXBaseInit)) {
|
||||
@ -1972,11 +1972,11 @@ Sema::SetBaseOrMemberInitializers(CXXConstructorDecl *Constructor,
|
||||
if (Base->isVirtual())
|
||||
continue;
|
||||
|
||||
if (CXXBaseOrMemberInitializer *Value
|
||||
if (CXXCtorInitializer *Value
|
||||
= Info.AllBaseFields.lookup(Base->getType()->getAs<RecordType>())) {
|
||||
Info.AllToInit.push_back(Value);
|
||||
} else if (!AnyErrors) {
|
||||
CXXBaseOrMemberInitializer *CXXBaseInit;
|
||||
CXXCtorInitializer *CXXBaseInit;
|
||||
if (BuildImplicitBaseInitializer(*this, Constructor, Info.IIK,
|
||||
Base, /*IsInheritedVirtualBase=*/false,
|
||||
CXXBaseInit)) {
|
||||
@ -2002,12 +2002,12 @@ Sema::SetBaseOrMemberInitializers(CXXConstructorDecl *Constructor,
|
||||
|
||||
NumInitializers = Info.AllToInit.size();
|
||||
if (NumInitializers > 0) {
|
||||
Constructor->setNumBaseOrMemberInitializers(NumInitializers);
|
||||
CXXBaseOrMemberInitializer **baseOrMemberInitializers =
|
||||
new (Context) CXXBaseOrMemberInitializer*[NumInitializers];
|
||||
Constructor->setNumCtorInitializers(NumInitializers);
|
||||
CXXCtorInitializer **baseOrMemberInitializers =
|
||||
new (Context) CXXCtorInitializer*[NumInitializers];
|
||||
memcpy(baseOrMemberInitializers, Info.AllToInit.data(),
|
||||
NumInitializers * sizeof(CXXBaseOrMemberInitializer*));
|
||||
Constructor->setBaseOrMemberInitializers(baseOrMemberInitializers);
|
||||
NumInitializers * sizeof(CXXCtorInitializer*));
|
||||
Constructor->setCtorInitializers(baseOrMemberInitializers);
|
||||
|
||||
// Constructors implicitly reference the base and member
|
||||
// destructors.
|
||||
@ -2032,7 +2032,7 @@ static void *GetKeyForBase(ASTContext &Context, QualType BaseType) {
|
||||
}
|
||||
|
||||
static void *GetKeyForMember(ASTContext &Context,
|
||||
CXXBaseOrMemberInitializer *Member) {
|
||||
CXXCtorInitializer *Member) {
|
||||
if (!Member->isAnyMemberInitializer())
|
||||
return GetKeyForBase(Context, QualType(Member->getBaseClass(), 0));
|
||||
|
||||
@ -2061,7 +2061,7 @@ static void *GetKeyForMember(ASTContext &Context,
|
||||
static void
|
||||
DiagnoseBaseOrMemInitializerOrder(Sema &SemaRef,
|
||||
const CXXConstructorDecl *Constructor,
|
||||
CXXBaseOrMemberInitializer **Inits,
|
||||
CXXCtorInitializer **Inits,
|
||||
unsigned NumInits) {
|
||||
if (Constructor->getDeclContext()->isDependentContext())
|
||||
return;
|
||||
@ -2070,7 +2070,7 @@ DiagnoseBaseOrMemInitializerOrder(Sema &SemaRef,
|
||||
// location of at least one initializer.
|
||||
bool ShouldCheckOrder = false;
|
||||
for (unsigned InitIndex = 0; InitIndex != NumInits; ++InitIndex) {
|
||||
CXXBaseOrMemberInitializer *Init = Inits[InitIndex];
|
||||
CXXCtorInitializer *Init = Inits[InitIndex];
|
||||
if (SemaRef.Diags.getDiagnosticLevel(diag::warn_initializer_out_of_order,
|
||||
Init->getSourceLocation())
|
||||
!= Diagnostic::Ignored) {
|
||||
@ -2110,9 +2110,9 @@ DiagnoseBaseOrMemInitializerOrder(Sema &SemaRef,
|
||||
unsigned NumIdealInits = IdealInitKeys.size();
|
||||
unsigned IdealIndex = 0;
|
||||
|
||||
CXXBaseOrMemberInitializer *PrevInit = 0;
|
||||
CXXCtorInitializer *PrevInit = 0;
|
||||
for (unsigned InitIndex = 0; InitIndex != NumInits; ++InitIndex) {
|
||||
CXXBaseOrMemberInitializer *Init = Inits[InitIndex];
|
||||
CXXCtorInitializer *Init = Inits[InitIndex];
|
||||
void *InitKey = GetKeyForMember(SemaRef.Context, Init);
|
||||
|
||||
// Scan forward to try to find this initializer in the idealized
|
||||
@ -2154,8 +2154,8 @@ DiagnoseBaseOrMemInitializerOrder(Sema &SemaRef,
|
||||
|
||||
namespace {
|
||||
bool CheckRedundantInit(Sema &S,
|
||||
CXXBaseOrMemberInitializer *Init,
|
||||
CXXBaseOrMemberInitializer *&PrevInit) {
|
||||
CXXCtorInitializer *Init,
|
||||
CXXCtorInitializer *&PrevInit) {
|
||||
if (!PrevInit) {
|
||||
PrevInit = Init;
|
||||
return false;
|
||||
@ -2180,11 +2180,11 @@ bool CheckRedundantInit(Sema &S,
|
||||
return true;
|
||||
}
|
||||
|
||||
typedef std::pair<NamedDecl *, CXXBaseOrMemberInitializer *> UnionEntry;
|
||||
typedef std::pair<NamedDecl *, CXXCtorInitializer *> UnionEntry;
|
||||
typedef llvm::DenseMap<RecordDecl*, UnionEntry> RedundantUnionMap;
|
||||
|
||||
bool CheckRedundantUnionInit(Sema &S,
|
||||
CXXBaseOrMemberInitializer *Init,
|
||||
CXXCtorInitializer *Init,
|
||||
RedundantUnionMap &Unions) {
|
||||
FieldDecl *Field = Init->getAnyMember();
|
||||
RecordDecl *Parent = Field->getParent();
|
||||
@ -2235,20 +2235,20 @@ void Sema::ActOnMemInitializers(Decl *ConstructorDecl,
|
||||
return;
|
||||
}
|
||||
|
||||
CXXBaseOrMemberInitializer **MemInits =
|
||||
reinterpret_cast<CXXBaseOrMemberInitializer **>(meminits);
|
||||
CXXCtorInitializer **MemInits =
|
||||
reinterpret_cast<CXXCtorInitializer **>(meminits);
|
||||
|
||||
// Mapping for the duplicate initializers check.
|
||||
// For member initializers, this is keyed with a FieldDecl*.
|
||||
// For base initializers, this is keyed with a Type*.
|
||||
llvm::DenseMap<void*, CXXBaseOrMemberInitializer *> Members;
|
||||
llvm::DenseMap<void*, CXXCtorInitializer *> Members;
|
||||
|
||||
// Mapping for the inconsistent anonymous-union initializers check.
|
||||
RedundantUnionMap MemberUnions;
|
||||
|
||||
bool HadError = false;
|
||||
for (unsigned i = 0; i < NumMemInits; i++) {
|
||||
CXXBaseOrMemberInitializer *Init = MemInits[i];
|
||||
CXXCtorInitializer *Init = MemInits[i];
|
||||
|
||||
// Set the source order index.
|
||||
Init->setSourceOrder(i);
|
||||
@ -2270,7 +2270,7 @@ void Sema::ActOnMemInitializers(Decl *ConstructorDecl,
|
||||
|
||||
DiagnoseBaseOrMemInitializerOrder(*this, Constructor, MemInits, NumMemInits);
|
||||
|
||||
SetBaseOrMemberInitializers(Constructor, MemInits, NumMemInits, AnyErrors);
|
||||
SetCtorInitializers(Constructor, MemInits, NumMemInits, AnyErrors);
|
||||
}
|
||||
|
||||
void
|
||||
@ -2369,7 +2369,7 @@ void Sema::ActOnDefaultCtorInitializers(Decl *CDtorDecl) {
|
||||
|
||||
if (CXXConstructorDecl *Constructor
|
||||
= dyn_cast<CXXConstructorDecl>(CDtorDecl))
|
||||
SetBaseOrMemberInitializers(Constructor, 0, 0, /*AnyErrors=*/false);
|
||||
SetCtorInitializers(Constructor, 0, 0, /*AnyErrors=*/false);
|
||||
}
|
||||
|
||||
bool Sema::RequireNonAbstractType(SourceLocation Loc, QualType T,
|
||||
@ -4442,7 +4442,7 @@ void Sema::DefineImplicitDefaultConstructor(SourceLocation CurrentLocation,
|
||||
|
||||
ImplicitlyDefinedFunctionScope Scope(*this, Constructor);
|
||||
DiagnosticErrorTrap Trap(Diags);
|
||||
if (SetBaseOrMemberInitializers(Constructor, 0, 0, /*AnyErrors=*/false) ||
|
||||
if (SetCtorInitializers(Constructor, 0, 0, /*AnyErrors=*/false) ||
|
||||
Trap.hasErrorOccurred()) {
|
||||
Diag(CurrentLocation, diag::note_member_synthesized_at)
|
||||
<< CXXConstructor << Context.getTagDeclType(ClassDecl);
|
||||
@ -5415,7 +5415,7 @@ void Sema::DefineImplicitCopyConstructor(SourceLocation CurrentLocation,
|
||||
ImplicitlyDefinedFunctionScope Scope(*this, CopyConstructor);
|
||||
DiagnosticErrorTrap Trap(Diags);
|
||||
|
||||
if (SetBaseOrMemberInitializers(CopyConstructor, 0, 0, /*AnyErrors=*/false) ||
|
||||
if (SetCtorInitializers(CopyConstructor, 0, 0, /*AnyErrors=*/false) ||
|
||||
Trap.hasErrorOccurred()) {
|
||||
Diag(CurrentLocation, diag::note_member_synthesized_at)
|
||||
<< CXXCopyConstructor << Context.getTagDeclType(ClassDecl);
|
||||
@ -7125,13 +7125,13 @@ void Sema::SetIvarInitializers(ObjCImplementationDecl *ObjCImplementation) {
|
||||
CollectIvarsToConstructOrDestruct(OID, ivars);
|
||||
if (ivars.empty())
|
||||
return;
|
||||
llvm::SmallVector<CXXBaseOrMemberInitializer*, 32> AllToInit;
|
||||
llvm::SmallVector<CXXCtorInitializer*, 32> AllToInit;
|
||||
for (unsigned i = 0; i < ivars.size(); i++) {
|
||||
FieldDecl *Field = ivars[i];
|
||||
if (Field->isInvalidDecl())
|
||||
continue;
|
||||
|
||||
CXXBaseOrMemberInitializer *Member;
|
||||
CXXCtorInitializer *Member;
|
||||
InitializedEntity InitEntity = InitializedEntity::InitializeMember(Field);
|
||||
InitializationKind InitKind =
|
||||
InitializationKind::CreateDefault(ObjCImplementation->getLocation());
|
||||
@ -7146,11 +7146,10 @@ void Sema::SetIvarInitializers(ObjCImplementationDecl *ObjCImplementation) {
|
||||
continue;
|
||||
|
||||
Member =
|
||||
new (Context) CXXBaseOrMemberInitializer(Context,
|
||||
Field, SourceLocation(),
|
||||
SourceLocation(),
|
||||
MemberInit.takeAs<Expr>(),
|
||||
SourceLocation());
|
||||
new (Context) CXXCtorInitializer(Context, Field, SourceLocation(),
|
||||
SourceLocation(),
|
||||
MemberInit.takeAs<Expr>(),
|
||||
SourceLocation());
|
||||
AllToInit.push_back(Member);
|
||||
|
||||
// Be sure that the destructor is accessible and is marked as referenced.
|
||||
|
@ -1981,14 +1981,14 @@ void Sema::CollectIvarsToConstructOrDestruct(ObjCInterfaceDecl *OI,
|
||||
}
|
||||
|
||||
void ObjCImplementationDecl::setIvarInitializers(ASTContext &C,
|
||||
CXXBaseOrMemberInitializer ** initializers,
|
||||
CXXCtorInitializer ** initializers,
|
||||
unsigned numInitializers) {
|
||||
if (numInitializers > 0) {
|
||||
NumIvarInitializers = numInitializers;
|
||||
CXXBaseOrMemberInitializer **ivarInitializers =
|
||||
new (C) CXXBaseOrMemberInitializer*[NumIvarInitializers];
|
||||
CXXCtorInitializer **ivarInitializers =
|
||||
new (C) CXXCtorInitializer*[NumIvarInitializers];
|
||||
memcpy(ivarInitializers, initializers,
|
||||
numInitializers * sizeof(CXXBaseOrMemberInitializer*));
|
||||
numInitializers * sizeof(CXXCtorInitializer*));
|
||||
IvarInitializers = ivarInitializers;
|
||||
}
|
||||
}
|
||||
|
@ -2359,7 +2359,7 @@ Sema::InstantiateMemInitializers(CXXConstructorDecl *New,
|
||||
for (CXXConstructorDecl::init_const_iterator Inits = Tmpl->init_begin(),
|
||||
InitsEnd = Tmpl->init_end();
|
||||
Inits != InitsEnd; ++Inits) {
|
||||
CXXBaseOrMemberInitializer *Init = *Inits;
|
||||
CXXCtorInitializer *Init = *Inits;
|
||||
|
||||
// Only instantiate written initializers, let Sema re-construct implicit
|
||||
// ones.
|
||||
|
@ -4338,17 +4338,16 @@ ASTReader::ReadCXXBaseSpecifier(PerFileData &F,
|
||||
EllipsisLoc);
|
||||
}
|
||||
|
||||
std::pair<CXXBaseOrMemberInitializer **, unsigned>
|
||||
ASTReader::ReadCXXBaseOrMemberInitializers(PerFileData &F,
|
||||
const RecordData &Record,
|
||||
unsigned &Idx) {
|
||||
CXXBaseOrMemberInitializer **BaseOrMemberInitializers = 0;
|
||||
std::pair<CXXCtorInitializer **, unsigned>
|
||||
ASTReader::ReadCXXCtorInitializers(PerFileData &F, const RecordData &Record,
|
||||
unsigned &Idx) {
|
||||
CXXCtorInitializer **CtorInitializers = 0;
|
||||
unsigned NumInitializers = Record[Idx++];
|
||||
if (NumInitializers) {
|
||||
ASTContext &C = *getContext();
|
||||
|
||||
BaseOrMemberInitializers
|
||||
= new (C) CXXBaseOrMemberInitializer*[NumInitializers];
|
||||
CtorInitializers
|
||||
= new (C) CXXCtorInitializer*[NumInitializers];
|
||||
for (unsigned i=0; i != NumInitializers; ++i) {
|
||||
TypeSourceInfo *BaseClassInfo = 0;
|
||||
bool IsBaseVirtual = false;
|
||||
@ -4382,38 +4381,32 @@ ASTReader::ReadCXXBaseOrMemberInitializers(PerFileData &F,
|
||||
Indices.push_back(cast<VarDecl>(GetDecl(Record[Idx++])));
|
||||
}
|
||||
|
||||
CXXBaseOrMemberInitializer *BOMInit;
|
||||
CXXCtorInitializer *BOMInit;
|
||||
if (IsBaseInitializer) {
|
||||
BOMInit = new (C) CXXBaseOrMemberInitializer(C, BaseClassInfo,
|
||||
IsBaseVirtual, LParenLoc,
|
||||
Init, RParenLoc,
|
||||
MemberOrEllipsisLoc);
|
||||
BOMInit = new (C) CXXCtorInitializer(C, BaseClassInfo, IsBaseVirtual,
|
||||
LParenLoc, Init, RParenLoc,
|
||||
MemberOrEllipsisLoc);
|
||||
} else if (IsWritten) {
|
||||
if (Member)
|
||||
BOMInit = new (C) CXXBaseOrMemberInitializer(C, Member,
|
||||
MemberOrEllipsisLoc,
|
||||
LParenLoc, Init,
|
||||
RParenLoc);
|
||||
BOMInit = new (C) CXXCtorInitializer(C, Member, MemberOrEllipsisLoc,
|
||||
LParenLoc, Init, RParenLoc);
|
||||
else
|
||||
BOMInit = new (C) CXXBaseOrMemberInitializer(C, IndirectMember,
|
||||
MemberOrEllipsisLoc,
|
||||
LParenLoc,
|
||||
Init, RParenLoc);
|
||||
BOMInit = new (C) CXXCtorInitializer(C, IndirectMember,
|
||||
MemberOrEllipsisLoc, LParenLoc,
|
||||
Init, RParenLoc);
|
||||
} else {
|
||||
BOMInit = CXXBaseOrMemberInitializer::Create(C, Member,
|
||||
MemberOrEllipsisLoc,
|
||||
LParenLoc, Init, RParenLoc,
|
||||
Indices.data(),
|
||||
Indices.size());
|
||||
BOMInit = CXXCtorInitializer::Create(C, Member, MemberOrEllipsisLoc,
|
||||
LParenLoc, Init, RParenLoc,
|
||||
Indices.data(), Indices.size());
|
||||
}
|
||||
|
||||
if (IsWritten)
|
||||
BOMInit->setSourceOrder(SourceOrderOrNumArrayIndices);
|
||||
BaseOrMemberInitializers[i] = BOMInit;
|
||||
CtorInitializers[i] = BOMInit;
|
||||
}
|
||||
}
|
||||
|
||||
return std::make_pair(BaseOrMemberInitializers, NumInitializers);
|
||||
return std::make_pair(CtorInitializers, NumInitializers);
|
||||
}
|
||||
|
||||
NestedNameSpecifier *
|
||||
|
@ -609,7 +609,7 @@ void ASTDeclReader::VisitObjCImplementationDecl(ObjCImplementationDecl *D) {
|
||||
D->setSuperClass(
|
||||
cast_or_null<ObjCInterfaceDecl>(Reader.GetDecl(Record[Idx++])));
|
||||
llvm::tie(D->IvarInitializers, D->NumIvarInitializers)
|
||||
= Reader.ReadCXXBaseOrMemberInitializers(F, Record, Idx);
|
||||
= Reader.ReadCXXCtorInitializers(F, Record, Idx);
|
||||
D->setHasSynthBitfield(Record[Idx++]);
|
||||
}
|
||||
|
||||
@ -903,8 +903,8 @@ void ASTDeclReader::VisitCXXConstructorDecl(CXXConstructorDecl *D) {
|
||||
|
||||
D->IsExplicitSpecified = Record[Idx++];
|
||||
D->ImplicitlyDefined = Record[Idx++];
|
||||
llvm::tie(D->BaseOrMemberInitializers, D->NumBaseOrMemberInitializers)
|
||||
= Reader.ReadCXXBaseOrMemberInitializers(F, Record, Idx);
|
||||
llvm::tie(D->CtorInitializers, D->NumCtorInitializers)
|
||||
= Reader.ReadCXXCtorInitializers(F, Record, Idx);
|
||||
}
|
||||
|
||||
void ASTDeclReader::VisitCXXDestructorDecl(CXXDestructorDecl *D) {
|
||||
|
@ -3294,12 +3294,13 @@ void ASTWriter::FlushCXXBaseSpecifiers() {
|
||||
CXXBaseSpecifiersToWrite.clear();
|
||||
}
|
||||
|
||||
void ASTWriter::AddCXXBaseOrMemberInitializers(
|
||||
const CXXBaseOrMemberInitializer * const *BaseOrMembers,
|
||||
unsigned NumBaseOrMembers, RecordDataImpl &Record) {
|
||||
Record.push_back(NumBaseOrMembers);
|
||||
for (unsigned i=0; i != NumBaseOrMembers; ++i) {
|
||||
const CXXBaseOrMemberInitializer *Init = BaseOrMembers[i];
|
||||
void ASTWriter::AddCXXCtorInitializers(
|
||||
const CXXCtorInitializer * const *CtorInitializers,
|
||||
unsigned NumCtorInitializers,
|
||||
RecordDataImpl &Record) {
|
||||
Record.push_back(NumCtorInitializers);
|
||||
for (unsigned i=0; i != NumCtorInitializers; ++i) {
|
||||
const CXXCtorInitializer *Init = CtorInitializers[i];
|
||||
|
||||
Record.push_back(Init->isBaseInitializer());
|
||||
if (Init->isBaseInitializer()) {
|
||||
|
@ -503,8 +503,8 @@ void ASTDeclWriter::VisitObjCCategoryImplDecl(ObjCCategoryImplDecl *D) {
|
||||
void ASTDeclWriter::VisitObjCImplementationDecl(ObjCImplementationDecl *D) {
|
||||
VisitObjCImplDecl(D);
|
||||
Writer.AddDeclRef(D->getSuperClass(), Record);
|
||||
Writer.AddCXXBaseOrMemberInitializers(D->IvarInitializers,
|
||||
D->NumIvarInitializers, Record);
|
||||
Writer.AddCXXCtorInitializers(D->IvarInitializers, D->NumIvarInitializers,
|
||||
Record);
|
||||
Record.push_back(D->hasSynthBitfield());
|
||||
Code = serialization::DECL_OBJC_IMPLEMENTATION;
|
||||
}
|
||||
@ -781,8 +781,8 @@ void ASTDeclWriter::VisitCXXConstructorDecl(CXXConstructorDecl *D) {
|
||||
|
||||
Record.push_back(D->IsExplicitSpecified);
|
||||
Record.push_back(D->ImplicitlyDefined);
|
||||
Writer.AddCXXBaseOrMemberInitializers(D->BaseOrMemberInitializers,
|
||||
D->NumBaseOrMemberInitializers, Record);
|
||||
Writer.AddCXXCtorInitializers(D->CtorInitializers, D->NumCtorInitializers,
|
||||
Record);
|
||||
|
||||
Code = serialization::DECL_CXX_CONSTRUCTOR;
|
||||
}
|
||||
|
@ -640,7 +640,7 @@ void ExprEngine::ProcessStmt(const CFGStmt S, StmtNodeBuilder& builder) {
|
||||
void ExprEngine::ProcessInitializer(const CFGInitializer Init,
|
||||
StmtNodeBuilder &builder) {
|
||||
// We don't set EntryNode and currentStmt. And we don't clean up state.
|
||||
const CXXBaseOrMemberInitializer *BMI = Init.getInitializer();
|
||||
const CXXCtorInitializer *BMI = Init.getInitializer();
|
||||
|
||||
ExplodedNode *Pred = builder.getBasePredecessor();
|
||||
const LocationContext *LC = Pred->getLocationContext();
|
||||
|
@ -689,11 +689,11 @@ bool CursorVisitor::VisitDeclaratorDecl(DeclaratorDecl *DD) {
|
||||
}
|
||||
|
||||
/// \brief Compare two base or member initializers based on their source order.
|
||||
static int CompareCXXBaseOrMemberInitializers(const void* Xp, const void *Yp) {
|
||||
CXXBaseOrMemberInitializer const * const *X
|
||||
= static_cast<CXXBaseOrMemberInitializer const * const *>(Xp);
|
||||
CXXBaseOrMemberInitializer const * const *Y
|
||||
= static_cast<CXXBaseOrMemberInitializer const * const *>(Yp);
|
||||
static int CompareCXXCtorInitializers(const void* Xp, const void *Yp) {
|
||||
CXXCtorInitializer const * const *X
|
||||
= static_cast<CXXCtorInitializer const * const *>(Xp);
|
||||
CXXCtorInitializer const * const *Y
|
||||
= static_cast<CXXCtorInitializer const * const *>(Yp);
|
||||
|
||||
if ((*X)->getSourceOrder() < (*Y)->getSourceOrder())
|
||||
return -1;
|
||||
@ -738,7 +738,7 @@ bool CursorVisitor::VisitFunctionDecl(FunctionDecl *ND) {
|
||||
if (ND->isThisDeclarationADefinition()) {
|
||||
if (CXXConstructorDecl *Constructor = dyn_cast<CXXConstructorDecl>(ND)) {
|
||||
// Find the initializers that were written in the source.
|
||||
llvm::SmallVector<CXXBaseOrMemberInitializer *, 4> WrittenInits;
|
||||
llvm::SmallVector<CXXCtorInitializer *, 4> WrittenInits;
|
||||
for (CXXConstructorDecl::init_iterator I = Constructor->init_begin(),
|
||||
IEnd = Constructor->init_end();
|
||||
I != IEnd; ++I) {
|
||||
@ -750,11 +750,11 @@ bool CursorVisitor::VisitFunctionDecl(FunctionDecl *ND) {
|
||||
|
||||
// Sort the initializers in source order
|
||||
llvm::array_pod_sort(WrittenInits.begin(), WrittenInits.end(),
|
||||
&CompareCXXBaseOrMemberInitializers);
|
||||
&CompareCXXCtorInitializers);
|
||||
|
||||
// Visit the initializers in source order
|
||||
for (unsigned I = 0, N = WrittenInits.size(); I != N; ++I) {
|
||||
CXXBaseOrMemberInitializer *Init = WrittenInits[I];
|
||||
CXXCtorInitializer *Init = WrittenInits[I];
|
||||
if (Init->isAnyMemberInitializer()) {
|
||||
if (Visit(MakeCursorMemberRef(Init->getAnyMember(),
|
||||
Init->getMemberLocation(), TU)))
|
||||
|
Loading…
x
Reference in New Issue
Block a user