'extern' variables in functions don't shadow externs in global scope. Fixes rdar://8883302, this time for C++ as well.

llvm-svn: 130157
This commit is contained in:
Argyrios Kyrtzidis 2011-04-25 21:39:50 +00:00
parent 7be2542fc9
commit bd0a3fe5e8
2 changed files with 15 additions and 14 deletions

View File

@ -3664,10 +3664,11 @@ void Sema::CheckShadow(Scope *S, VarDecl *D, const LookupResult& R) {
return;
// Don't diagnose declarations at file scope.
DeclContext *NewDC = D->getDeclContext();
if (NewDC->isFileContext())
if (D->hasGlobalStorage())
return;
DeclContext *NewDC = D->getDeclContext();
// Only diagnose if we're shadowing an unambiguous field or variable.
if (R.getResultKind() != LookupResult::Found)
return;
@ -3684,17 +3685,6 @@ void Sema::CheckShadow(Scope *S, VarDecl *D, const LookupResult& R) {
if (VarDecl *shadowedVar = dyn_cast<VarDecl>(ShadowedDecl))
if (shadowedVar->isExternC()) {
// Don't warn for this case:
//
// @code
// extern int bob;
// void f() {
// extern int bob;
// }
// @endcode
if (D->isExternC())
return;
// For shadowing external vars, make sure that we point to the global
// declaration, not a locally scoped extern declaration.
for (VarDecl::redecl_iterator

View File

@ -70,3 +70,14 @@ struct S {
}
};
}
extern int bob; // expected-note {{previous declaration is here}}
// rdar://8883302
void rdar8883302() {
extern int bob; // don't warn for shadowing.
}
void test8() {
int bob; // expected-warning {{declaration shadows a variable in the global namespace}}
}