summaryrefslogtreecommitdiffstats
path: root/clang
diff options
context:
space:
mode:
Diffstat (limited to 'clang')
-rw-r--r--clang/lib/Sema/SemaDecl.cpp2
-rw-r--r--clang/test/Sema/warn-shadow.c7
-rw-r--r--clang/test/SemaCXX/warn-shadow.cpp7
3 files changed, 15 insertions, 1 deletions
diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp
index 95623ef100f..ef17f8d57b9 100644
--- a/clang/lib/Sema/SemaDecl.cpp
+++ b/clang/lib/Sema/SemaDecl.cpp
@@ -16295,7 +16295,7 @@ Decl *Sema::ActOnEnumConstant(Scope *S, Decl *theEnumDecl, Decl *lastEnumConst,
return nullptr;
if (PrevDecl) {
- if (!TheEnumDecl->isScoped()) {
+ if (!TheEnumDecl->isScoped() && isa<ValueDecl>(PrevDecl)) {
// Check for other kinds of shadowing not already handled.
CheckShadow(New, PrevDecl, R);
}
diff --git a/clang/test/Sema/warn-shadow.c b/clang/test/Sema/warn-shadow.c
index 8d1d0aed693..aa8505b0c91 100644
--- a/clang/test/Sema/warn-shadow.c
+++ b/clang/test/Sema/warn-shadow.c
@@ -64,3 +64,10 @@ 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}}
}
+
+struct PR24718_3;
+struct PR24718_4 {
+ enum {
+ PR24718_3 // Does not shadow a type.
+ };
+};
diff --git a/clang/test/SemaCXX/warn-shadow.cpp b/clang/test/SemaCXX/warn-shadow.cpp
index e4ad352788a..33203f018c8 100644
--- a/clang/test/SemaCXX/warn-shadow.cpp
+++ b/clang/test/SemaCXX/warn-shadow.cpp
@@ -225,3 +225,10 @@ void f(int a) {
int PR24718;
enum class X { PR24718 }; // Ok, not shadowing
+
+struct PR24718_1;
+struct PR24718_2 {
+ enum {
+ PR24718_1 // Does not shadow a type.
+ };
+};
OpenPOWER on IntegriCloud