From 444e8412950ee28cafb4d32a8c8598c81a98d6da Mon Sep 17 00:00:00 2001 From: Argiris Kirtzidis Date: Mon, 31 Jan 2011 07:04:50 +0000 Subject: [PATCH] Fix the diagnostic when we are shadowing an external variable and there exists a locally scoped extern with the same name. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@124580 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Sema/SemaDecl.cpp | 37 ++++++++++++++++++++++++------------- test/Sema/warn-shadow.c | 7 ++++++- 2 files changed, 30 insertions(+), 14 deletions(-) diff --git a/lib/Sema/SemaDecl.cpp b/lib/Sema/SemaDecl.cpp index 24307c98a..253f1dcde 100644 --- a/lib/Sema/SemaDecl.cpp +++ b/lib/Sema/SemaDecl.cpp @@ -3129,21 +3129,32 @@ void Sema::CheckShadow(Scope *S, VarDecl *D, const LookupResult& R) { if (!isa(ShadowedDecl) && !isa(ShadowedDecl)) return; - DeclContext *OldDC = ShadowedDecl->getDeclContext(); - - // Don't warn for this case: - // - // @code - // extern int bob; - // void f() { - // extern int bob; - // } - // @endcode - if (D->isExternC() && NewDC->isFunctionOrMethod()) - if (VarDecl *shadowedVar = dyn_cast(ShadowedDecl)) - if (shadowedVar->isExternC()) + if (VarDecl *shadowedVar = dyn_cast(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 + I = shadowedVar->redecls_begin(), E = shadowedVar->redecls_end(); + I != E; ++I) + if (I->isFileVarDecl()) { + ShadowedDecl = *I; + break; + } + } + + DeclContext *OldDC = ShadowedDecl->getDeclContext(); + // Only warn about certain kinds of shadowing for class members. if (NewDC && NewDC->isRecord()) { // In particular, don't warn about shadowing non-class members. diff --git a/test/Sema/warn-shadow.c b/test/Sema/warn-shadow.c index c77bb0c45..32aca8d61 100644 --- a/test/Sema/warn-shadow.c +++ b/test/Sema/warn-shadow.c @@ -49,8 +49,13 @@ void test5(int i); void test6(void (*f)(int i)) {} void test7(void *context, void (*callback)(void *context)) {} +extern int bob; // expected-note {{previous declaration is here}} + // rdar://8883302 -extern int bob; void rdar8883302() { extern int bob; // don't warn for shadowing. } + +void test8() { + int bob; // expected-warning {{declaration shadows a variable in the global scope}} +} -- 2.11.4.GIT