When looking for an entity's Scope, don't consider scopes that can't contain declarations. Fixes PR7594.

llvm-svn: 107927
This commit is contained in:
Sebastian Redl 2010-07-08 23:07:34 +00:00
parent 823e90e12a
commit caef9ab03c
2 changed files with 17 additions and 3 deletions

View File

@ -405,9 +405,12 @@ Scope *Sema::getScopeForContext(DeclContext *Ctx) {
Ctx = Ctx->getPrimaryContext();
for (Scope *S = getCurScope(); S; S = S->getParent()) {
if (DeclContext *Entity = static_cast<DeclContext *> (S->getEntity()))
if (Ctx == Entity->getPrimaryContext())
return S;
// Ignore scopes that cannot have declarations. This is important for
// out-of-line definitions of static class members.
if (S->getFlags() & (Scope::DeclScope | Scope::TemplateParamScope))
if (DeclContext *Entity = static_cast<DeclContext *> (S->getEntity()))
if (Ctx == Entity->getPrimaryContext())
return S;
}
return 0;

View File

@ -39,3 +39,14 @@ namespace PR6570 {
};
}
namespace PR7594 {
// If the lazy declaration of special member functions is triggered
// in an out-of-line initializer, make sure the functions aren't in
// the initializer scope. This used to crash Clang:
struct C {
C();
static C *c;
};
C *C::c = new C();
}