RecName += "_IMPL";
IdentifierInfo *II = &Context->Idents.get(RecName.c_str());
RecordDecl *RD = RecordDecl::Create(*Context, TagDecl::TK_struct, TUDecl,
- SourceLocation(), II, 0);
+ SourceLocation(), II);
assert(RD && "RewriteObjCIvarRefExpr(): Can't find RecordDecl");
QualType castT = Context->getPointerType(Context->getTagDeclType(RD));
CastExpr *castExpr = new ExplicitCastExpr(castT, IV->getBase(),
RecName += "_IMPL";
IdentifierInfo *II = &Context->Idents.get(RecName.c_str());
RecordDecl *RD = RecordDecl::Create(*Context, TagDecl::TK_struct, TUDecl,
- SourceLocation(), II, 0);
+ SourceLocation(), II);
assert(RD && "RewriteObjCIvarRefExpr(): Can't find RecordDecl");
QualType castT = Context->getPointerType(Context->getTagDeclType(RD));
CastExpr *castExpr = new ExplicitCastExpr(castT, IV->getBase(),
llvm::SmallVector<QualType, 16> ArgTys;
RecordDecl *RD = RecordDecl::Create(*Context, TagDecl::TK_struct, TUDecl,
SourceLocation(),
- &Context->Idents.get("objc_super"), 0);
+ &Context->Idents.get("objc_super"));
QualType argT = Context->getPointerType(Context->getTagDeclType(RD));
assert(!argT.isNull() && "Can't build 'struct objc_super *' type");
ArgTys.push_back(argT);
llvm::SmallVector<QualType, 16> ArgTys;
RecordDecl *RD = RecordDecl::Create(*Context, TagDecl::TK_struct, TUDecl,
SourceLocation(),
- &Context->Idents.get("objc_super"), 0);
+ &Context->Idents.get("objc_super"));
QualType argT = Context->getPointerType(Context->getTagDeclType(RD));
assert(!argT.isNull() && "Can't build 'struct objc_super *' type");
ArgTys.push_back(argT);
if (!SuperStructDecl) {
SuperStructDecl = RecordDecl::Create(*Context, TagDecl::TK_struct, TUDecl,
SourceLocation(),
- &Context->Idents.get("objc_super"), 0);
+ &Context->Idents.get("objc_super"));
QualType FieldTypes[2];
// struct objc_object *receiver;
if (!ConstantStringDecl) {
ConstantStringDecl = RecordDecl::Create(*Context, TagDecl::TK_struct, TUDecl,
SourceLocation(),
- &Context->Idents.get("__NSConstantStringImpl"), 0);
+ &Context->Idents.get("__NSConstantStringImpl"));
QualType FieldTypes[4];
// struct objc_object *receiver;
/// array member (e.g. int X[]) or if this union contains a struct that does.
/// If so, this cannot be contained in arrays or other structs as a member.
bool HasFlexibleArrayMember : 1;
-
- /// NextDecl - A pointer to the next RecordDecl in a chain of RecordDecls
- /// for the same struct/union. By construction, the last RecordDecl in
- /// the chain is the one that provides the definition of the struct/union
- /// (i.e., all forward declarations appear first in the chain). Note that
- /// one should make no other assumption about the order of the RecordDecl's
- /// within this chain with respect to the original source.
- /// NOTE: This is *not* an owning reference.
- RecordDecl* NextDecl;
/// Members/NumMembers - This is a new[]'d array of pointers to Decls.
FieldDecl **Members; // Null if not defined.
int NumMembers; // -1 if not defined.
protected:
- RecordDecl(Kind DK, DeclContext *DC, SourceLocation L, IdentifierInfo *Id,
- RecordDecl *PrevDecl);
-
+ RecordDecl(Kind DK, DeclContext *DC, SourceLocation L, IdentifierInfo *Id);
virtual ~RecordDecl();
public:
static RecordDecl *Create(ASTContext &C, TagKind TK, DeclContext *DC,
- SourceLocation L, IdentifierInfo *Id,
- RecordDecl *PrevDecl);
+ SourceLocation L, IdentifierInfo *Id);
virtual void Destroy(ASTContext& C);
-
- /// getDefinitionDecl - Returns the RecordDecl for the struct/union that
- /// represents the actual definition (i.e., not a forward declaration).
- /// This method returns NULL if no such RecordDecl exists.
- const RecordDecl* getDefinitionDecl() const;
-
+
bool hasFlexibleArrayMember() const { return HasFlexibleArrayMember; }
void setHasFlexibleArrayMember(bool V) { HasFlexibleArrayMember = V; }
/// The only difference with RecordDecl is that CXXRecordDecl is a DeclContext.
class CXXRecordDecl : public RecordDecl, public DeclContext {
protected:
- CXXRecordDecl(Kind DK, DeclContext *DC, SourceLocation L, IdentifierInfo *Id,
- CXXRecordDecl *PrevDecl) : RecordDecl(DK, DC, L, Id, PrevDecl),
- DeclContext(DK) {
+ CXXRecordDecl(Kind DK, DeclContext *DC, SourceLocation L, IdentifierInfo *Id)
+ : RecordDecl(DK, DC, L, Id), DeclContext(DK) {
assert(classof(static_cast<Decl*>(this)) && "Invalid Kind!");
}
public:
static CXXRecordDecl *Create(ASTContext &C, TagKind TK, DeclContext *DC,
- SourceLocation L, IdentifierInfo *Id,
- CXXRecordDecl *PrevDecl);
+ SourceLocation L, IdentifierInfo *Id);
const CXXFieldDecl *getMember(unsigned i) const {
return cast<const CXXFieldDecl>(RecordDecl::getMember(i));
if (!CFConstantStringTypeDecl) {
CFConstantStringTypeDecl =
RecordDecl::Create(*this, TagDecl::TK_struct, TUDecl, SourceLocation(),
- &Idents.get("NSConstantString"), 0);
+ &Idents.get("NSConstantString"));
QualType FieldTypes[4];
// const int *isa;
ObjCFastEnumerationStateTypeDecl =
RecordDecl::Create(*this, TagDecl::TK_struct, TUDecl, SourceLocation(),
- &Idents.get("__objcFastEnumerationState"), 0);
+ &Idents.get("__objcFastEnumerationState"));
ObjCFastEnumerationStateTypeDecl->defineBody(FieldDecls, 4);
}
//===----------------------------------------------------------------------===//
RecordDecl::RecordDecl(Kind DK, DeclContext *DC, SourceLocation L,
- IdentifierInfo *Id, RecordDecl *PrevDecl)
-: TagDecl(DK, DC, L, Id, 0), NextDecl(0) {
+ IdentifierInfo *Id)
+: TagDecl(DK, DC, L, Id, 0) {
HasFlexibleArrayMember = false;
assert(classof(static_cast<Decl*>(this)) && "Invalid Kind!");
Members = 0;
- NumMembers = -1;
-
- // Hook up the RecordDecl chain.
- if (PrevDecl) {
- RecordDecl* Tmp = PrevDecl->NextDecl;
- // 'Tmp' might be non-NULL if it is the RecordDecl that provides the
- // definition of the struct/union. By construction, the last RecordDecl
- // in the chain is the 'defining' RecordDecl.
- if (Tmp) {
- assert (Tmp->NextDecl == 0);
- assert (Tmp->isDefinition()
- && "Previous RecordDecl has a NextDecl that is "
- "not the 'defining' RecordDecl");
-
- NextDecl = Tmp;
- }
-
- PrevDecl->NextDecl = this;
- }
+ NumMembers = -1;
}
RecordDecl *RecordDecl::Create(ASTContext &C, TagKind TK, DeclContext *DC,
- SourceLocation L, IdentifierInfo *Id,
- RecordDecl *PrevDecl) {
+ SourceLocation L, IdentifierInfo *Id) {
+
void *Mem = C.getAllocator().Allocate<RecordDecl>();
Kind DK;
switch (TK) {
case TK_union: DK = Union; break;
case TK_class: DK = Class; break;
}
- return new (Mem) RecordDecl(DK, DC, L, Id, PrevDecl);
+ return new (Mem) RecordDecl(DK, DC, L, Id);
}
RecordDecl::~RecordDecl() {
return Members[i];
return 0;
}
-
-/// getDefinitionDecl - Returns the RecordDecl for the struct/union that
-/// represents the actual definition (i.e., not a forward declaration).
-/// This method returns NULL if no such RecordDecl exists.
-const RecordDecl* RecordDecl::getDefinitionDecl() const {
- const RecordDecl* R = this;
-
- for (RecordDecl* N = R->NextDecl; N; N = R->NextDecl)
- R = N;
-
- return R->Members ? R : 0;
-}
-
}\r
\r
CXXRecordDecl *CXXRecordDecl::Create(ASTContext &C, TagKind TK, DeclContext *DC,\r
- SourceLocation L, IdentifierInfo *Id,\r
- CXXRecordDecl *PrevDecl) {\r
+ SourceLocation L, IdentifierInfo *Id) {\r
Kind DK;\r
switch (TK) {\r
default: assert(0 && "Invalid TagKind!");\r
case TK_class: DK = CXXClass; break;\r
}\r
void *Mem = C.getAllocator().Allocate<CXXRecordDecl>();\r
- return new (Mem) CXXRecordDecl(DK, DC, L, Id, PrevDecl);\r
+ return new (Mem) CXXRecordDecl(DK, DC, L, Id);\r
}\r
\r
CXXMethodDecl *\r
ScopedDecl::EmitInRec(S);
S.EmitBool(isDefinition());
S.EmitBool(hasFlexibleArrayMember());
- S.EmitPtr(NextDecl);
S.EmitSInt(getNumMembers());
if (getNumMembers() > 0) {
assert (Members);
ASTContext& C) {
void *Mem = C.getAllocator().Allocate<RecordDecl>();
- RecordDecl* decl = new (Mem) RecordDecl(DK, 0, SourceLocation(), NULL, NULL);
+ RecordDecl* decl = new (Mem) RecordDecl(DK, 0, SourceLocation(), NULL);
decl->ScopedDecl::ReadInRec(D, C);
decl->setDefinition(D.ReadBool());
decl->setHasFlexibleArrayMember(D.ReadBool());
- D.ReadPtr(decl->NextDecl); // Allow backpatching.
decl->NumMembers = D.ReadSInt();
if (decl->getNumMembers() > 0) {
// FIXME: Merge with rewriter code?
RecordDecl *RD = RecordDecl::Create(Ctx, TagDecl::TK_struct, 0,
SourceLocation(),
- &Ctx.Idents.get("_objc_super"), 0);
+ &Ctx.Idents.get("_objc_super"));
FieldDecl *FieldDecls[2];
FieldDecls[0] = FieldDecl::Create(Ctx, SourceLocation(), 0,
Ctx.getObjCIdType());
if (C.getLangOptions().CPlusPlus)
return CXXRecordDecl::Create(C, TagDecl::TK_struct,
C.getTranslationUnitDecl(),
- SourceLocation(), &C.Idents.get(Name), 0);
+ SourceLocation(), &C.Idents.get(Name));
else
return RecordDecl::Create(C, TagDecl::TK_struct,
C.getTranslationUnitDecl(),
- SourceLocation(), &C.Idents.get(Name), 0);
+ SourceLocation(), &C.Idents.get(Name));
}
void Sema::ActOnTranslationUnitScope(SourceLocation Loc, Scope *S) {
// We use 'dyn_cast' instead of 'cast' because PrevDecl might not
// be a CXXRecordDecl* if we had a redefinition error. In this case,
// the dyn_cast will return a NULL pointer.
- New = CXXRecordDecl::Create(Context, Kind, CurContext, Loc, Name,
- dyn_cast_or_null<CXXRecordDecl>(PrevDecl));
+ New = CXXRecordDecl::Create(Context, Kind, CurContext, Loc, Name);
else
// We use 'dyn_cast' instead of 'cast' because PrevDecl might not
// be a RecordDecl* if we had a redefinition error. In this case,
// the dyn_cast will return a NULL pointer.
- New = RecordDecl::Create(Context, Kind, CurContext, Loc, Name,
- dyn_cast_or_null<RecordDecl>(PrevDecl));
+ New = RecordDecl::Create(Context, Kind, CurContext, Loc, Name);
}
// If this has an identifier, add it to the scope stack.