diff options
author | Aaron Ballman <aaron@aaronballman.com> | 2012-07-19 03:12:23 +0000 |
---|---|---|
committer | Aaron Ballman <aaron@aaronballman.com> | 2012-07-19 03:12:23 +0000 |
commit | f81678707e936cf04a2a9f7c21d51a77ffc1f6c9 (patch) | |
tree | 1907fba588b95b215027a243394adc22d4d19de5 | |
parent | 7c30427afb4c2171ee4d336477f5e4d7c277ccb4 (diff) |
Relaxed enumeration constant naming rules for scoped enumerators so they no longer emit a diagnostic when the enumeration's name matches that of the class. Fixes PR13128.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@160490 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/Sema/SemaDecl.cpp | 18 | ||||
-rw-r--r-- | test/SemaCXX/enum-scoped.cpp | 7 |
2 files changed, 19 insertions, 6 deletions
diff --git a/lib/Sema/SemaDecl.cpp b/lib/Sema/SemaDecl.cpp index 4041ccf9d3..6c6aeb1ab1 100644 --- a/lib/Sema/SemaDecl.cpp +++ b/lib/Sema/SemaDecl.cpp @@ -10406,15 +10406,21 @@ Decl *Sema::ActOnEnumConstant(Scope *S, Decl *theEnumDecl, Decl *lastEnumConst, } } - // C++ [class.mem]p13: - // If T is the name of a class, then each of the following shall have a - // name different from T: - // - every enumerator of every member of class T that is an enumerated - // type + // C++ [class.mem]p15: + // If T is the name of a class, then each of the following shall have a name + // different from T: + // - every enumerator of every member of class T that is an unscoped + // enumerated type + // + // C++ [dcl.enum]p10: + // Each enum-name and each unscoped enumerator is declared in the scope that + // immediately contains the enum-specifier. Each scoped enumerator is declared + // in the scope of the enumeration. if (CXXRecordDecl *Record = dyn_cast<CXXRecordDecl>( TheEnumDecl->getDeclContext()->getRedeclContext())) - if (Record->getIdentifier() && Record->getIdentifier() == Id) + if (!TheEnumDecl->isScoped() && + Record->getIdentifier() && Record->getIdentifier() == Id) Diag(IdLoc, diag::err_member_name_of_class) << Id; EnumConstantDecl *New = diff --git a/test/SemaCXX/enum-scoped.cpp b/test/SemaCXX/enum-scoped.cpp index ebe9245358..a1f911d79d 100644 --- a/test/SemaCXX/enum-scoped.cpp +++ b/test/SemaCXX/enum-scoped.cpp @@ -245,3 +245,10 @@ namespace test10 { int m = g<int>(); int n = g<short>(); // expected-note {{here}} } + +namespace pr13128 { + // This should compile cleanly + class C { + enum class E { C }; + }; +} |