aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Driver/ASTConsumers.cpp8
-rw-r--r--Driver/RewriteBlocks.cpp2
-rw-r--r--Driver/RewriteObjC.cpp38
-rw-r--r--docs/InternalsManual.html19
-rw-r--r--include/clang/AST/ASTConsumer.h2
-rw-r--r--include/clang/AST/Decl.h242
-rw-r--r--include/clang/AST/DeclBase.h214
-rw-r--r--include/clang/AST/DeclCXX.h42
-rw-r--r--include/clang/AST/DeclObjC.h63
-rw-r--r--include/clang/AST/Stmt.h17
-rw-r--r--include/clang/AST/StmtIterator.h9
-rw-r--r--include/clang/Analysis/Support/BlkExprDeclBitVector.h10
-rw-r--r--include/clang/Analysis/Visitors/CFGRecStmtDeclVisitor.h11
-rw-r--r--lib/AST/ASTContext.cpp6
-rw-r--r--lib/AST/CFG.cpp10
-rw-r--r--lib/AST/Decl.cpp77
-rw-r--r--lib/AST/DeclBase.cpp94
-rw-r--r--lib/AST/DeclCXX.cpp10
-rw-r--r--lib/AST/DeclObjC.cpp7
-rw-r--r--lib/AST/DeclSerialization.cpp256
-rw-r--r--lib/AST/StmtDumper.cpp2
-rw-r--r--lib/AST/StmtIterator.cpp2
-rw-r--r--lib/AST/StmtPrinter.cpp10
-rw-r--r--lib/AST/StmtSerialization.cpp38
-rw-r--r--lib/Analysis/GRExprEngine.cpp2
-rw-r--r--lib/CodeGen/CGObjC.cpp2
-rw-r--r--lib/CodeGen/CGObjCMac.cpp4
-rw-r--r--lib/CodeGen/ModuleBuilder.cpp4
-rw-r--r--lib/Sema/IdentifierResolver.cpp13
-rw-r--r--lib/Sema/IdentifierResolver.h6
-rw-r--r--lib/Sema/Sema.cpp8
-rw-r--r--lib/Sema/Sema.h27
-rw-r--r--lib/Sema/SemaDecl.cpp95
-rw-r--r--lib/Sema/SemaDeclCXX.cpp15
-rw-r--r--lib/Sema/SemaDeclObjC.cpp16
-rw-r--r--lib/Sema/SemaExpr.cpp13
-rw-r--r--lib/Sema/SemaExprCXX.cpp4
-rw-r--r--lib/Sema/SemaLookup.cpp9
-rw-r--r--lib/Sema/SemaOverload.cpp13
-rw-r--r--lib/Sema/SemaStmt.cpp12
-rw-r--r--test/Serialization/complex.c1
-rw-r--r--test/Serialization/stmt_exprs.c4
42 files changed, 630 insertions, 807 deletions
diff --git a/Driver/ASTConsumers.cpp b/Driver/ASTConsumers.cpp
index 6729746573..6f66307c4b 100644
--- a/Driver/ASTConsumers.cpp
+++ b/Driver/ASTConsumers.cpp
@@ -122,8 +122,8 @@ void DeclPrinter:: PrintDecl(Decl *D) {
Out << "asm(";
AD->getAsmString()->printPretty(Out);
Out << ")\n";
- } else if (ScopedDecl *SD = dyn_cast<ScopedDecl>(D)) {
- Out << "Read top-level variable decl: '" << SD->getNameAsString() << "'\n";
+ } else if (NamedDecl *ND = dyn_cast<NamedDecl>(D)) {
+ Out << "Read top-level variable decl: '" << ND->getNameAsString() << "'\n";
} else {
assert(0 && "Unknown decl type!");
}
@@ -480,8 +480,8 @@ namespace {
}
} else if (TypedefDecl *TD = dyn_cast<TypedefDecl>(D)) {
PrintTypeDefDecl(TD);
- } else if (ScopedDecl *SD = dyn_cast<ScopedDecl>(D)) {
- Out << "Read top-level variable decl: '" << SD->getNameAsString()
+ } else if (NamedDecl *ND = dyn_cast<NamedDecl>(D)) {
+ Out << "Read top-level variable decl: '" << ND->getNameAsString()
<< "'\n";
} else if (ObjCInterfaceDecl *OID = dyn_cast<ObjCInterfaceDecl>(D)) {
Out << "Read objc interface '" << OID->getNameAsString() << "'\n";
diff --git a/Driver/RewriteBlocks.cpp b/Driver/RewriteBlocks.cpp
index c729a904f6..706eef8918 100644
--- a/Driver/RewriteBlocks.cpp
+++ b/Driver/RewriteBlocks.cpp
@@ -1025,7 +1025,7 @@ Stmt *RewriteBlocks::RewriteFunctionBody(Stmt *S) {
for (DeclStmt::decl_iterator DI = DS->decl_begin(), DE = DS->decl_end();
DI != DE; ++DI) {
- ScopedDecl *SD = *DI;
+ Decl *SD = *DI;
if (ValueDecl *ND = dyn_cast<ValueDecl>(SD)) {
if (isBlockPointerType(ND->getType()))
RewriteBlockPointerDecl(ND);
diff --git a/Driver/RewriteObjC.cpp b/Driver/RewriteObjC.cpp
index 8af30f22e8..3c797c5b6d 100644
--- a/Driver/RewriteObjC.cpp
+++ b/Driver/RewriteObjC.cpp
@@ -224,7 +224,7 @@ namespace {
ObjCImplementationDecl *IMD,
ObjCCategoryImplDecl *CID);
void RewriteInterfaceDecl(ObjCInterfaceDecl *Dcl);
- void RewriteImplementationDecl(NamedDecl *Dcl);
+ void RewriteImplementationDecl(Decl *Dcl);
void RewriteObjCMethodDecl(ObjCMethodDecl *MDecl, std::string &ResultStr);
void RewriteCategoryDecl(ObjCCategoryDecl *Dcl);
void RewriteProtocolDecl(ObjCProtocolDecl *Dcl);
@@ -967,7 +967,7 @@ void RewriteObjC::RewriteObjCMethodDecl(ObjCMethodDecl *OMD,
}
}
}
-void RewriteObjC::RewriteImplementationDecl(NamedDecl *OID) {
+void RewriteObjC::RewriteImplementationDecl(Decl *OID) {
ObjCImplementationDecl *IMD = dyn_cast<ObjCImplementationDecl>(OID);
ObjCCategoryImplDecl *CID = dyn_cast<ObjCCategoryImplDecl>(OID);
@@ -1297,7 +1297,7 @@ Stmt *RewriteObjC::RewriteObjCForCollectionStmt(ObjCForCollectionStmt *S,
buf = "\n{\n\t";
if (DeclStmt *DS = dyn_cast<DeclStmt>(S->getElement())) {
// type elem;
- ScopedDecl* D = DS->getSolitaryDecl();
+ NamedDecl* D = cast<NamedDecl>(DS->getSolitaryDecl());
QualType ElementType = cast<ValueDecl>(D)->getType();
elementTypeAsString = ElementType.getAsString();
buf += elementTypeAsString;
@@ -1920,7 +1920,7 @@ void RewriteObjC::SynthSelGetUidFunctionDecl() {
SelGetUidFunctionDecl = FunctionDecl::Create(*Context, TUDecl,
SourceLocation(),
SelGetUidIdent, getFuncType,
- FunctionDecl::Extern, false, 0);
+ FunctionDecl::Extern, false);
}
// SynthGetProtocolFunctionDecl - Protocol objc_getProtocol(const char *proto);
@@ -1935,7 +1935,7 @@ void RewriteObjC::SynthGetProtocolFunctionDecl() {
GetProtocolFunctionDecl = FunctionDecl::Create(*Context, TUDecl,
SourceLocation(),
SelGetProtoIdent, getFuncType,
- FunctionDecl::Extern, false, 0);
+ FunctionDecl::Extern, false);
}
void RewriteObjC::RewriteFunctionDecl(FunctionDecl *FD) {
@@ -1964,7 +1964,7 @@ void RewriteObjC::SynthSuperContructorFunctionDecl() {
SuperContructorFunctionDecl = FunctionDecl::Create(*Context, TUDecl,
SourceLocation(),
msgSendIdent, msgSendType,
- FunctionDecl::Extern, false, 0);
+ FunctionDecl::Extern, false);
}
// SynthMsgSendFunctionDecl - id objc_msgSend(id self, SEL op, ...);
@@ -1983,7 +1983,7 @@ void RewriteObjC::SynthMsgSendFunctionDecl() {
MsgSendFunctionDecl = FunctionDecl::Create(*Context, TUDecl,
SourceLocation(),
msgSendIdent, msgSendType,
- FunctionDecl::Extern, false, 0);
+ FunctionDecl::Extern, false);
}
// SynthMsgSendSuperFunctionDecl - id objc_msgSendSuper(struct objc_super *, SEL op, ...);
@@ -2005,7 +2005,7 @@ void RewriteObjC::SynthMsgSendSuperFunctionDecl() {
MsgSendSuperFunctionDecl = FunctionDecl::Create(*Context, TUDecl,
SourceLocation(),
msgSendIdent, msgSendType,
- FunctionDecl::Extern, false, 0);
+ FunctionDecl::Extern, false);
}
// SynthMsgSendStretFunctionDecl - id objc_msgSend_stret(id self, SEL op, ...);
@@ -2024,7 +2024,7 @@ void RewriteObjC::SynthMsgSendStretFunctionDecl() {
MsgSendStretFunctionDecl = FunctionDecl::Create(*Context, TUDecl,
SourceLocation(),
msgSendIdent, msgSendType,
- FunctionDecl::Extern, false, 0);
+ FunctionDecl::Extern, false);
}
// SynthMsgSendSuperStretFunctionDecl -
@@ -2048,7 +2048,7 @@ void RewriteObjC::SynthMsgSendSuperStretFunctionDecl() {
MsgSendSuperStretFunctionDecl = FunctionDecl::Create(*Context, TUDecl,
SourceLocation(),
msgSendIdent, msgSendType,
- FunctionDecl::Extern, false, 0);
+ FunctionDecl::Extern, false);
}
// SynthMsgSendFpretFunctionDecl - double objc_msgSend_fpret(id self, SEL op, ...);
@@ -2067,7 +2067,7 @@ void RewriteObjC::SynthMsgSendFpretFunctionDecl() {
MsgSendFpretFunctionDecl = FunctionDecl::Create(*Context, TUDecl,
SourceLocation(),
msgSendIdent, msgSendType,
- FunctionDecl::Extern, false, 0);
+ FunctionDecl::Extern, false);
}
// SynthGetClassFunctionDecl - id objc_getClass(const char *name);
@@ -2082,7 +2082,7 @@ void RewriteObjC::SynthGetClassFunctionDecl() {
GetClassFunctionDecl = FunctionDecl::Create(*Context, TUDecl,
SourceLocation(),
getClassIdent, getClassType,
- FunctionDecl::Extern, false, 0);
+ FunctionDecl::Extern, false);
}
// SynthGetMetaClassFunctionDecl - id objc_getClass(const char *name);
@@ -2097,7 +2097,7 @@ void RewriteObjC::SynthGetMetaClassFunctionDecl() {
GetMetaClassFunctionDecl = FunctionDecl::Create(*Context, TUDecl,
SourceLocation(),
getClassIdent, getClassType,
- FunctionDecl::Extern, false, 0);
+ FunctionDecl::Extern, false);
}
Stmt *RewriteObjC::RewriteObjCStringLiteral(ObjCStringLiteral *Exp) {
@@ -2131,7 +2131,7 @@ Stmt *RewriteObjC::RewriteObjCStringLiteral(ObjCStringLiteral *Exp) {
VarDecl *NewVD = VarDecl::Create(*Context, TUDecl, SourceLocation(),
&Context->Idents.get(S.c_str()), strType,
- VarDecl::Static, NULL);
+ VarDecl::Static);
DeclRefExpr *DRE = new DeclRefExpr(NewVD, strType, SourceLocation());
Expr *Unop = new UnaryOperator(DRE, UnaryOperator::AddrOf,
Context->getPointerType(DRE->getType()),
@@ -2175,7 +2175,7 @@ QualType RewriteObjC::getSuperStructType() {
SuperStructDecl->addDecl(FieldDecl::Create(*Context, SuperStructDecl,
SourceLocation(), 0,
FieldTypes[i], /*BitWidth=*/0,
- /*Mutable=*/false, 0));
+ /*Mutable=*/false));
}
SuperStructDecl->completeDefinition(*Context);
@@ -2206,7 +2206,7 @@ QualType RewriteObjC::getConstantStringStructType() {
SourceLocation(), 0,
FieldTypes[i],
/*BitWidth=*/0,
- /*Mutable=*/true, 0));
+ /*Mutable=*/true));
}
ConstantStringDecl->completeDefinition(*Context);
@@ -3816,7 +3816,7 @@ Stmt *RewriteObjC::SynthesizeBlockCall(CallExpr *Exp) {
FieldDecl *FD = FieldDecl::Create(*Context, 0, SourceLocation(),
&Context->Idents.get("FuncPtr"), Context->VoidPtrTy,
- /*BitWidth=*/0, /*Mutable=*/true, 0);
+ /*BitWidth=*/0, /*Mutable=*/true);
MemberExpr *ME = new MemberExpr(PE, true, FD, SourceLocation(), FD->getType());
CastExpr *FunkCast = new CStyleCastExpr(PtrToFuncCastType, ME, PtrToFuncCastType, SourceLocation(), SourceLocation());
@@ -4021,7 +4021,7 @@ FunctionDecl *RewriteObjC::SynthBlockInitFunctionDecl(const char *name) {
IdentifierInfo *ID = &Context->Idents.get(name);
QualType FType = Context->getFunctionTypeNoProto(Context->VoidPtrTy);
return FunctionDecl::Create(*Context, TUDecl,SourceLocation(),
- ID, FType, FunctionDecl::Extern, false, 0);
+ ID, FType, FunctionDecl::Extern, false);
}
Stmt *RewriteObjC::SynthBlockInitExpr(BlockExpr *Exp) {
@@ -4304,7 +4304,7 @@ Stmt *RewriteObjC::RewriteFunctionBodyOrGlobalInitializer(Stmt *S) {
// Blocks rewrite rules.
for (DeclStmt::decl_iterator DI = DS->decl_begin(), DE = DS->decl_end();
DI != DE; ++DI) {
- ScopedDecl *SD = *DI;
+ Decl *SD = *DI;
if (ValueDecl *ND = dyn_cast<ValueDecl>(SD)) {
if (isTopLevelBlockPointerType(ND->getType()))
RewriteBlockPointerDecl(ND);
diff --git a/docs/InternalsManual.html b/docs/InternalsManual.html
index 2fcadb7a79..27232843d3 100644
--- a/docs/InternalsManual.html
+++ b/docs/InternalsManual.html
@@ -1019,14 +1019,12 @@ malloc'd objects are at least 8 byte aligned.</p>
(de-)serialization.</dd>
</dl>
-<p>The declarations stored within each declaration context are
- called <i>scoped declarations</i> and the AST nodes for each of
- these declarations are
- derived from the <code>ScopedDecl</code> class, which provides
- information about the context in which that declaration lives. One
+<p>All declarations are stored within a declaration context, and one
+ can query
+ information about the context in which each declaration lives. One
can retrieve the <code>DeclContext</code> that contains a
- particular <code>ScopedDecl</code>
- using <code>ScopedDecl::getDeclContext</code>. However, see the
+ particular <code>Decl</code>
+ using <code>Decl::getDeclContext</code>. However, see the
section <a href="#LexicalAndSemanticContexts">Lexical and Semantic
Contexts</a> for more information about how to interpret this
context information.</p>
@@ -1065,15 +1063,14 @@ void g(int);
primarily use this semantics-centric view.</p>
<h4 id="LexicalAndSemanticContexts">Lexical and Semantic Contexts</h4>
-<p>Each scoped declaration (whose AST node derived
- from <code>ScopedDecl</code>) has two potentially different
+<p>Each declaration has two potentially different
declaration contexts: a <i>lexical</i> context, which corresponds to
the source-centric view of the declaration context, and
a <i>semantic</i> context, which corresponds to the
semantics-centric view. The lexical context is accessible
- via <code>ScopedDecl::getLexicalDeclContext</code> while the
+ via <code>Decl::getLexicalDeclContext</code> while the
semantic context is accessible
- via <code>ScopedDecl::getDeclContext</code>, both of which return
+ via <code>Decl::getDeclContext</code>, both of which return
<code>DeclContext</code> pointers. For most declarations, the two
contexts are identical. For example:</p>
diff --git a/include/clang/AST/ASTConsumer.h b/include/clang/AST/ASTConsumer.h
index 2ba36b0a57..efb701e6d5 100644
--- a/include/clang/AST/ASTConsumer.h
+++ b/include/clang/AST/ASTConsumer.h
@@ -37,7 +37,7 @@ public:
/// HandleTopLevelDecl - Handle the specified top-level declaration. This is
/// called by the parser to process every top-level Decl*. Note that D can
/// be the head of a chain of Decls (e.g. for `int a, b` the chain will have
- /// two elements). Use ScopedDecl::getNextDeclarator() to walk the chain.
+ /// two elements). Use Decl::getNextDeclarator() to walk the chain.
virtual void HandleTopLevelDecl(Decl *D) {}
/// HandleTranslationUnit - This method is called when the ASTs for entire
diff --git a/include/clang/AST/Decl.h b/include/clang/AST/Decl.h
index 050768fe30..988a7419a5 100644
--- a/include/clang/AST/Decl.h
+++ b/include/clang/AST/Decl.h
@@ -31,9 +31,10 @@ class StringLiteral;
/// FIXME: The TranslationUnit class should probably be modified to serve as
/// the top decl context. It would have ownership of the top decls so that the
/// AST is self-contained and easily de/serializable.
+/// FIXME: TranslationUnitDecl isn't really a Decl (!)
class TranslationUnitDecl : public Decl, public DeclContext {
TranslationUnitDecl()
- : Decl(TranslationUnit, SourceLocation()),
+ : Decl(TranslationUnit, 0, SourceLocation()),
DeclContext(TranslationUnit) {}
public:
static TranslationUnitDecl *Create(ASTContext &C);
@@ -66,13 +67,13 @@ class NamedDecl : public Decl {
DeclarationName Name;
protected:
- NamedDecl(Kind DK, SourceLocation L, DeclarationName N)
- : Decl(DK, L), Name(N) {}
+ NamedDecl(Kind DK, DeclContext *DC, SourceLocation L, DeclarationName N)
+ : Decl(DK, DC, L), Name(N) {}
-public:
- NamedDecl(Kind DK, SourceLocation L, IdentifierInfo *Id)
- : Decl(DK, L), Name(Id) {}
+ NamedDecl(Kind DK, DeclContext *DC, SourceLocation L, IdentifierInfo *Id)
+ : Decl(DK, DC, L), Name(Id) {}
+public:
/// getIdentifier - Get the identifier that names this declaration,
/// if there is one. This will return NULL if this declaration has
/// no name (e.g., for an unnamed class) or if the name is a special
@@ -98,126 +99,6 @@ public:
/// For simple declarations, getNameAsCString() should suffice.
std::string getNameAsString() const { return Name.getAsString(); }
- static bool classof(const Decl *D) {
- return D->getKind() >= NamedFirst && D->getKind() <= NamedLast;
- }
- static bool classof(const NamedDecl *D) { return true; }
-
-protected:
- void EmitInRec(llvm::Serializer& S) const;
- void ReadInRec(llvm::Deserializer& D, ASTContext& C);
-};
-
-/// ScopedDecl - Represent lexically scoped names, used for all ValueDecl's
-/// and TypeDecl's.
-class ScopedDecl : public NamedDecl {
- /// NextDeclarator - If this decl was part of a multi-declarator declaration,
- /// such as "int X, Y, *Z;" this indicates Decl for the next declarator.
- ScopedDecl *NextDeclarator;
-
- /// NextDeclInScope - The next declaration within the same lexical
- /// DeclContext. These pointers form the linked list that is
- /// traversed via DeclContext's decls_begin()/decls_end().
- /// FIXME: If NextDeclarator is non-NULL, will it always be the same
- /// as NextDeclInScope? If so, we can use a
- /// PointerIntPair<ScopedDecl*, 1> to make ScopedDecl smaller.
- ScopedDecl *NextDeclInScope;
-
- friend class DeclContext;
- friend class DeclContext::decl_iterator;
-
- /// DeclCtx - Holds either a DeclContext* or a MultipleDC*.
- /// For declarations that don't contain C++ scope specifiers, it contains
- /// the DeclContext where the ScopedDecl was declared.
- /// For declarations with C++ scope specifiers, it contains a MultipleDC*
- /// with the context where it semantically belongs (SemanticDC) and the
- /// context where it was lexically declared (LexicalDC).
- /// e.g.:
- ///
- /// namespace A {
- /// void f(); // SemanticDC == LexicalDC == 'namespace A'
- /// }
- /// void A::f(); // SemanticDC == namespace 'A'
- /// // LexicalDC == global namespace
- uintptr_t DeclCtx;
-
- struct MultipleDC {
- DeclContext *SemanticDC;
- DeclContext *LexicalDC;
- };
-
- inline bool isInSemaDC() const { return (DeclCtx & 0x1) == 0; }
- inline bool isOutOfSemaDC() const { return (DeclCtx & 0x1) != 0; }
- inline MultipleDC *getMultipleDC() const {
- return reinterpret_cast<MultipleDC*>(DeclCtx & ~0x1);
- }
-
-protected:
- ScopedDecl(Kind DK, DeclContext *DC, SourceLocation L,
- DeclarationName N, ScopedDecl *PrevDecl = 0)
- : NamedDecl(DK, L, N), NextDeclarator(PrevDecl), NextDeclInScope(0),
- DeclCtx(reinterpret_cast<uintptr_t>(DC)) {}
-
- virtual ~ScopedDecl();
-
- /// setDeclContext - Set both the semantic and lexical DeclContext
- /// to DC.
- void setDeclContext(DeclContext *DC);
-
-public:
- const DeclContext *getDeclContext() const {
- if (isInSemaDC())
- return reinterpret_cast<DeclContext*>(DeclCtx);
- return getMultipleDC()->SemanticDC;
- }
- DeclContext *getDeclContext() {
- return const_cast<DeclContext*>(
- const_cast<const ScopedDecl*>(this)->getDeclContext());
- }
-
- void setAccess(AccessSpecifier AS) { Access = AS; }
- AccessSpecifier getAccess() const { return AccessSpecifier(Access); }
-
- /// getLexicalDeclContext - The declaration context where this ScopedDecl was
- /// lexically declared (LexicalDC). May be different from
- /// getDeclContext() (SemanticDC).
- /// e.g.:
- ///
- /// namespace A {
- /// void f(); // SemanticDC == LexicalDC == 'namespace A'
- /// }
- /// void A::f(); // SemanticDC == namespace 'A'
- /// // LexicalDC == global namespace
- const DeclContext *getLexicalDeclContext() const {
- if (isInSemaDC())
- return reinterpret_cast<DeclContext*>(DeclCtx);
- return getMultipleDC()->LexicalDC;
- }
- DeclContext *getLexicalDeclContext() {
- return const_cast<DeclContext*>(
- const_cast<const ScopedDecl*>(this)->getLexicalDeclContext());
- }
-
- void setLexicalDeclContext(DeclContext *DC);
-
- /// getNextDeclarator - If this decl was part of a multi-declarator
- /// declaration, such as "int X, Y, *Z;" this returns the decl for the next
- /// declarator. Otherwise it returns null.
- ScopedDecl *getNextDeclarator() { return NextDeclarator; }
- const ScopedDecl *getNextDeclarator() const { return NextDeclarator; }
- void setNextDeclarator(ScopedDecl *N) { NextDeclarator = N; }
-
- // isDefinedOutsideFunctionOrMethod - This predicate returns true if this
- // scoped decl is defined outside the current function or method. This is
- // roughly global variables and functions, but also handles enums (which could
- // be defined inside or outside a function etc).
- bool isDefinedOutsideFunctionOrMethod() const {
- if (getDeclContext())
- return !getDeclContext()->getLookupContext()->isFunctionOrMethod();
- else
- return true;
- }
-
/// declarationReplaces - Determine whether this declaration, if
/// known to be well-formed within its context, will replace the
/// declaration OldD if introduced into scope. A declaration will
@@ -227,24 +108,18 @@ public:
/// overloaded function.
bool declarationReplaces(NamedDecl *OldD) const;
- // Implement isa/cast/dyncast/etc.
static bool classof(const Decl *D) {
- return D->getKind() >= ScopedFirst && D->getKind() <= ScopedLast;
+ return D->getKind() >= NamedFirst && D->getKind() <= NamedLast;
}
- static bool classof(const ScopedDecl *D) { return true; }
+ static bool classof(const NamedDecl *D) { return true; }
protected:
void EmitInRec(llvm::Serializer& S) const;
void ReadInRec(llvm::Deserializer& D, ASTContext& C);
-
- void EmitOutRec(llvm::Serializer& S) const;
- void ReadOutRec(llvm::Deserializer& D, ASTContext& C);
-
- friend void Decl::Destroy(ASTContext& C);
};
/// NamespaceDecl - Represent a C++ namespace.
-class NamespaceDecl : public ScopedDecl, public DeclContext {
+class NamespaceDecl : public NamedDecl, public DeclContext {
SourceLocation LBracLoc, RBracLoc;
// For extended namespace definitions:
@@ -260,7 +135,7 @@ class NamespaceDecl : public ScopedDecl, public DeclContext {
NamespaceDecl *OrigNamespace;
NamespaceDecl(DeclContext *DC, SourceLocation L, IdentifierInfo *Id)
- : ScopedDecl(Namespace, DC, L, Id, 0), DeclContext(Namespace) {
+ : NamedDecl(Namespace, DC, L, Id), DeclContext(Namespace) {
OrigNamespace = this;
}
public:
@@ -314,13 +189,13 @@ protected:
/// ValueDecl - Represent the declaration of a variable (in which case it is
/// an lvalue) a function (in which case it is a function designator) or
/// an enum constant.
-class ValueDecl : public ScopedDecl {
+class ValueDecl : public NamedDecl {
QualType DeclType;
protected:
ValueDecl(Kind DK, DeclContext *DC, SourceLocation L,
- DeclarationName N, QualType T, ScopedDecl *PrevDecl)
- : ScopedDecl(DK, DC, L, N, PrevDecl), DeclType(T) {}
+ DeclarationName N, QualType T)
+ : NamedDecl(DK, DC, L, N), DeclType(T) {}
public:
QualType getType() const { return DeclType; }
void setType(QualType newType) { DeclType = newType; }
@@ -359,9 +234,8 @@ private:
friend class StmtIteratorBase;
protected:
VarDecl(Kind DK, DeclContext *DC, SourceLocation L, IdentifierInfo *Id,
- QualType T, StorageClass SC, ScopedDecl *PrevDecl,
- SourceLocation TSSL = SourceLocation())
- : ValueDecl(DK, DC, L, Id, T, PrevDecl), Init(0),
+ QualType T, StorageClass SC, SourceLocation TSSL = SourceLocation())
+ : ValueDecl(DK, DC, L, Id, T), Init(0),
ThreadSpecified(false), HasCXXDirectInit(false),
DeclaredInCondition(false), TypeSpecStartLoc(TSSL) {
SClass = SC;
@@ -369,7 +243,7 @@ protected:
public:
static VarDecl *Create(ASTContext &C, DeclContext *DC,
SourceLocation L, IdentifierInfo *Id,
- QualType T, StorageClass S, ScopedDecl *PrevDecl,
+ QualType T, StorageClass S,
SourceLocation TypeSpecStartLoc = SourceLocation());
virtual ~VarDecl();
@@ -480,12 +354,12 @@ protected:
class ImplicitParamDecl : public VarDecl {
protected:
ImplicitParamDecl(Kind DK, DeclContext *DC, SourceLocation L,
- IdentifierInfo *Id, QualType T, ScopedDecl *PrevDecl)
- : VarDecl(DK, DC, L, Id, T, VarDecl::None, PrevDecl) {}
+ IdentifierInfo *Id, QualType Tw)
+ : VarDecl(DK, DC, L, Id, Tw, VarDecl::None) {}
public:
static ImplicitParamDecl *Create(ASTContext &C, DeclContext *DC,
SourceLocation L, IdentifierInfo *Id,
- QualType T, ScopedDecl *PrevDecl);
+ QualType T);
// Implement isa/cast/dyncast/etc.
static bool classof(const ImplicitParamDecl *D) { return true; }
static bool classof(const Decl *D) { return D->getKind() == ImplicitParam; }
@@ -503,15 +377,14 @@ class ParmVarDecl : public VarDecl {
protected:
ParmVarDecl(Kind DK, DeclContext *DC, SourceLocation L,
IdentifierInfo *Id, QualType T, StorageClass S,
- Expr *DefArg, ScopedDecl *PrevDecl)
- : VarDecl(DK, DC, L, Id, T, S, PrevDecl),
+ Expr *DefArg)
+ : VarDecl(DK, DC, L, Id, T, S),
objcDeclQualifier(OBJC_TQ_None), DefaultArg(DefArg) {}
public:
static ParmVarDecl *Create(ASTContext &C, DeclContext *DC,
SourceLocation L,IdentifierInfo *Id,
- QualType T, StorageClass S, Expr *DefArg,
- ScopedDecl *PrevDecl);
+ QualType T, StorageClass S, Expr *DefArg);
ObjCDeclQualifier getObjCDeclQualifier() const {
return ObjCDeclQualifier(objcDeclQualifier);
@@ -582,15 +455,13 @@ private:
ParmVarWithOriginalTypeDecl(DeclContext *DC, SourceLocation L,
IdentifierInfo *Id, QualType T,
QualType OT, StorageClass S,
- Expr *DefArg, ScopedDecl *PrevDecl)
- : ParmVarDecl(OriginalParmVar,
- DC, L, Id, T, S, DefArg, PrevDecl), OriginalType(OT) {}
+ Expr *DefArg)
+ : ParmVarDecl(OriginalParmVar, DC, L, Id, T, S, DefArg), OriginalType(OT) {}
public:
static ParmVarWithOriginalTypeDecl *Create(ASTContext &C, DeclContext *DC,
SourceLocation L,IdentifierInfo *Id,
QualType T, QualType OT,
- StorageClass S, Expr *DefArg,
- ScopedDecl *PrevDecl);
+ StorageClass S, Expr *DefArg);
// Implement isa/cast/dyncast/etc.
static bool classof(const Decl *D) { return D->getKind() == OriginalParmVar; }
@@ -656,9 +527,9 @@ private:
protected:
FunctionDecl(Kind DK, DeclContext *DC, SourceLocation L,
DeclarationName N, QualType T,
- StorageClass S, bool isInline, ScopedDecl *PrevDecl,
+ StorageClass S, bool isInline,
SourceLocation TSSL = SourceLocation())
- : ValueDecl(DK, DC, L, N, T, PrevDecl),
+ : ValueDecl(DK, DC, L, N, T),
DeclContext(DK),
ParamInfo(0), Body(0), PreviousDeclaration(0),
SClass(S), IsInline(isInline), IsVirtual(false), IsPure(false),
@@ -670,8 +541,7 @@ protected:
public:
static FunctionDecl *Create(ASTContext &C, DeclContext *DC, SourceLocation L,
DeclarationName N, QualType T,
- StorageClass S = None, bool isInline = false,
- ScopedDecl *PrevDecl = 0,
+ StorageClass S = None, bool isInline = false,
SourceLocation TSStartLoc = SourceLocation());
SourceLocation getTypeSpecStartLoc() const { return TypeSpecStartLoc; }
@@ -784,22 +654,21 @@ protected:
/// Fiel