forked from OSchip/llvm-project
'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:
parent
7be2542fc9
commit
bd0a3fe5e8
|
@ -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
|
||||
|
|
|
@ -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}}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue