When redeclaring a local extern in the same scope, make sure that we

replace the existing declaration appropriately. Patch by Jordy Rose,
fixes PR10013 / <rdar://problem/9584157>.

llvm-svn: 134097
This commit is contained in:
Douglas Gregor 2011-06-29 21:22:02 +00:00
parent 6999f86617
commit 825faf7a4f
2 changed files with 26 additions and 3 deletions

View File

@ -3299,8 +3299,18 @@ Sema::RegisterLocallyScopedExternCDecl(NamedDecl *ND,
if (S && IdResolver.ReplaceDecl(PrevDecl, ND)) {
// The previous declaration was found on the identifer resolver
// chain, so remove it from its scope.
while (S && !S->isDeclScope(PrevDecl))
S = S->getParent();
if (S->isDeclScope(PrevDecl)) {
// Special case for redeclarations in the SAME scope.
// Because this declaration is going to be added to the identifier chain
// later, we should temporarily take it OFF the chain.
IdResolver.RemoveDecl(ND);
} else {
// Find the scope for the original declaration.
while (S && !S->isDeclScope(PrevDecl))
S = S->getParent();
}
if (S)
S->RemoveDecl(PrevDecl);

View File

@ -1,4 +1,4 @@
// RUN: %clang_cc1 -fsyntax-only %s
// RUN: %clang_cc1 -fsyntax-only -verify %s
// rdar: // 8125274
static int a16[]; // expected-warning {{tentative array definition assumed to have one element}}
@ -7,3 +7,16 @@ void f16(void) {
extern int a16[];
}
// PR10013: Scope of extern declarations extend past enclosing block
extern int PR10013_x;
int PR10013(void) {
int *PR10013_x = 0;
{
extern int PR10013_x;
extern int PR10013_x;
}
return PR10013_x; // expected-warning{{incompatible pointer to integer conversion}}
}