diff options
| author | Aaron Ballman <aaron@aaronballman.com> | 2018-10-11 16:40:18 +0000 |
|---|---|---|
| committer | Aaron Ballman <aaron@aaronballman.com> | 2018-10-11 16:40:18 +0000 |
| commit | 20ea72476c31f96ee526b06f050aef05956be9fd (patch) | |
| tree | c9d613f2f45620f93638d2bac48d4c3a2fb39417 /clang | |
| parent | 61adf8aeb4cb5521f774e2ede1e8f90f452f3816 (diff) | |
| download | bcm5719-llvm-20ea72476c31f96ee526b06f050aef05956be9fd.tar.gz bcm5719-llvm-20ea72476c31f96ee526b06f050aef05956be9fd.zip | |
Improve -Wshadow warnings with enumerators.
Addresses PR24718 by checking for enumerators that shadow other enumerators. Catches issues like:
enum E1{e1};
void f(void) {
enum E2{e1};
}
llvm-svn: 344259
Diffstat (limited to 'clang')
| -rw-r--r-- | clang/lib/Sema/SemaDecl.cpp | 11 | ||||
| -rw-r--r-- | clang/test/Sema/warn-shadow.c | 5 | ||||
| -rw-r--r-- | clang/test/SemaCXX/warn-shadow.cpp | 3 |
3 files changed, 17 insertions, 2 deletions
diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp index 7ef1ad2bbb0..95623ef100f 100644 --- a/clang/lib/Sema/SemaDecl.cpp +++ b/clang/lib/Sema/SemaDecl.cpp @@ -16269,8 +16269,10 @@ Decl *Sema::ActOnEnumConstant(Scope *S, Decl *theEnumDecl, Decl *lastEnumConst, // Verify that there isn't already something declared with this name in this // scope. - NamedDecl *PrevDecl = LookupSingleName(S, Id, IdLoc, LookupOrdinaryName, - ForVisibleRedeclaration); + LookupResult R(*this, Id, IdLoc, LookupOrdinaryName, ForVisibleRedeclaration); + LookupName(R, S); + NamedDecl *PrevDecl = R.getAsSingle<NamedDecl>(); + if (PrevDecl && PrevDecl->isTemplateParameter()) { // Maybe we will complain about the shadowed template parameter. DiagnoseTemplateParameterShadow(IdLoc, PrevDecl); @@ -16293,6 +16295,11 @@ Decl *Sema::ActOnEnumConstant(Scope *S, Decl *theEnumDecl, Decl *lastEnumConst, return nullptr; if (PrevDecl) { + if (!TheEnumDecl->isScoped()) { + // Check for other kinds of shadowing not already handled. + CheckShadow(New, PrevDecl, R); + } + // When in C++, we may get a TagDecl with the same name; in this case the // enum constant will 'hide' the tag. assert((getLangOpts().CPlusPlus || !isa<TagDecl>(PrevDecl)) && diff --git a/clang/test/Sema/warn-shadow.c b/clang/test/Sema/warn-shadow.c index 32aca8d612b..8d1d0aed693 100644 --- a/clang/test/Sema/warn-shadow.c +++ b/clang/test/Sema/warn-shadow.c @@ -59,3 +59,8 @@ void rdar8883302() { void test8() { int bob; // expected-warning {{declaration shadows a variable in the global scope}} } + +enum PR24718_1{pr24718}; // expected-note {{previous declaration is here}} +void PR24718(void) { + enum PR24718_2{pr24718}; // expected-warning {{declaration shadows a variable in the global scope}} +} diff --git a/clang/test/SemaCXX/warn-shadow.cpp b/clang/test/SemaCXX/warn-shadow.cpp index 3d09c786285..e4ad352788a 100644 --- a/clang/test/SemaCXX/warn-shadow.cpp +++ b/clang/test/SemaCXX/warn-shadow.cpp @@ -222,3 +222,6 @@ void f(int a) { }; } } + +int PR24718; +enum class X { PR24718 }; // Ok, not shadowing |

