Make sure that ScopedDecls passed to DeclContext::addDecl are added into their lexical context

llvm-svn: 61998
This commit is contained in:
Douglas Gregor
2009-01-09 18:51:29 +00:00
parent 5f54d50917
commit c72e645fd6
4 changed files with 28 additions and 3 deletions

View File

@@ -144,11 +144,15 @@ class ScopedDecl : public NamedDecl {
protected:
ScopedDecl(Kind DK, DeclContext *DC, SourceLocation L,
DeclarationName N, ScopedDecl *PrevDecl = 0)
: NamedDecl(DK, L, N), NextDeclarator(PrevDecl),
: NamedDecl(DK, L, N), NextDeclarator(PrevDecl),
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())
@@ -532,6 +536,12 @@ public:
QualType getOriginalType() const;
/// setOwningFunction - Sets the function declaration that owns this
/// ParmVarDecl. Since ParmVarDecls are often created before the
/// FunctionDecls that own them, this routine is required to update
/// the DeclContext appropriately.
void setOwningFunction(DeclContext *FD) { setDeclContext(FD); }
// Implement isa/cast/dyncast/etc.
static bool classof(const Decl *D) {
return (D->getKind() == ParmVar ||

View File

@@ -164,6 +164,13 @@ FileScopeAsmDecl *FileScopeAsmDecl::Create(ASTContext &C,
// ScopedDecl Implementation
//===----------------------------------------------------------------------===//
void ScopedDecl::setDeclContext(DeclContext *DC) {
if (isOutOfSemaDC())
delete getMultipleDC();
DeclCtx = reinterpret_cast<uintptr_t>(DC);
}
void ScopedDecl::setLexicalDeclContext(DeclContext *DC) {
if (DC == getLexicalDeclContext())
return;

View File

@@ -514,6 +514,7 @@ DeclContext *DeclContext::getNextContext() {
}
void DeclContext::addDecl(ASTContext &Context, ScopedDecl *D, bool AllowLookup) {
assert(D->getLexicalDeclContext() == this && "Decl inserted into wrong lexical context");
Decls.push_back(D);
if (AllowLookup)
D->getDeclContext()->insert(Context, D);
@@ -599,7 +600,6 @@ void DeclContext::insert(ASTContext &Context, ScopedDecl *D) {
if (LookupPtr.getPointer())
insertImpl(D);
// If we are a transparent context, insert into our parent context,
// too. This operation is recursive.
if (isTransparentContext())

View File

@@ -441,7 +441,13 @@ ScopedDecl *Sema::LazilyCreateBuiltin(IdentifierInfo *II, unsigned bid,
// TUScope is the translation-unit scope to insert this function into.
// FIXME: This is hideous. We need to teach PushOnScopeChains to
// relate Scopes to DeclContexts, and probably eliminate CurContext
// entirely, but we're not there yet.
DeclContext *SavedContext = CurContext;
CurContext = Context.getTranslationUnitDecl();
PushOnScopeChains(New, TUScope);
CurContext = SavedContext;
return New;
}
@@ -2705,6 +2711,8 @@ Sema::DeclTy *Sema::ActOnStartOfFunctionDef(Scope *FnBodyScope, DeclTy *D) {
// Introduce our parameters into the function scope
for (unsigned p = 0, NumParams = FD->getNumParams(); p < NumParams; ++p) {
ParmVarDecl *Param = FD->getParamDecl(p);
Param->setOwningFunction(FD);
// If this has an identifier, add it to the scope stack.
if (Param->getIdentifier())
PushOnScopeChains(Param, FnBodyScope);