summaryrefslogtreecommitdiffstats
path: root/clang
diff options
context:
space:
mode:
authorAaron Ballman <aaron@aaronballman.com>2018-10-11 16:40:18 +0000
committerAaron Ballman <aaron@aaronballman.com>2018-10-11 16:40:18 +0000
commit20ea72476c31f96ee526b06f050aef05956be9fd (patch)
treec9d613f2f45620f93638d2bac48d4c3a2fb39417 /clang
parent61adf8aeb4cb5521f774e2ede1e8f90f452f3816 (diff)
downloadbcm5719-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.cpp11
-rw-r--r--clang/test/Sema/warn-shadow.c5
-rw-r--r--clang/test/SemaCXX/warn-shadow.cpp3
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
OpenPOWER on IntegriCloud