mirror of
https://github.com/intel/llvm.git
synced 2026-02-03 02:26:27 +08:00
Make sure that ScopedDecls passed to DeclContext::addDecl are added into their lexical context
llvm-svn: 61998
This commit is contained in:
@@ -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 ||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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())
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user