From bd25998a45b53aa5d87fcefb41e6b02b75db7edf Mon Sep 17 00:00:00 2001 From: Argyrios Kyrtzidis Date: Wed, 16 Jul 2008 21:01:53 +0000 Subject: [PATCH] When in C++, make EnumConstant names hide tag names in the same scope, instead of colliding with them. llvm-svn: 53702 --- clang/lib/Sema/SemaDecl.cpp | 7 ++++++- clang/test/Sema/class-names.cpp | 2 ++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp index 00c73ea765c4..6acbb2d1845a 100644 --- a/clang/lib/Sema/SemaDecl.cpp +++ b/clang/lib/Sema/SemaDecl.cpp @@ -2121,7 +2121,12 @@ Sema::DeclTy *Sema::ActOnEnumConstant(Scope *S, DeclTy *theEnumDecl, // Verify that there isn't already something declared with this name in this // scope. if (Decl *PrevDecl = LookupDecl(Id, Decl::IDNS_Ordinary, S)) { - if (IdResolver.isDeclInScope(PrevDecl, CurContext, S)) { + // When in C++, we may get a TagDecl with the same name; in this case the + // enum constant will 'hide' the tag. + assert((getLangOptions().CPlusPlus || !isa(PrevDecl)) && + "Received TagDecl when not in C++!"); + if (!isa(PrevDecl) && + IdResolver.isDeclInScope(PrevDecl, CurContext, S)) { if (isa(PrevDecl)) Diag(IdLoc, diag::err_redefinition_of_enumerator, Id->getName()); else diff --git a/clang/test/Sema/class-names.cpp b/clang/test/Sema/class-names.cpp index b78d6964e260..2a9cd74c3bac 100644 --- a/clang/test/Sema/class-names.cpp +++ b/clang/test/Sema/class-names.cpp @@ -48,3 +48,5 @@ void bar3() { } enum E e2; + +enum E2 { E2 }; -- GitLab