diff options
-rw-r--r-- | docs/ReleaseNotes.html | 1 | ||||
-rw-r--r-- | include/clang/Basic/DiagnosticSemaKinds.td | 2 | ||||
-rw-r--r-- | lib/Sema/SemaDecl.cpp | 5 | ||||
-rw-r--r-- | lib/Sema/SemaTemplateInstantiate.cpp | 3 | ||||
-rw-r--r-- | test/SemaCXX/enum-scoped.cpp | 11 | ||||
-rw-r--r-- | www/cxx_status.html | 2 |
6 files changed, 20 insertions, 4 deletions
diff --git a/docs/ReleaseNotes.html b/docs/ReleaseNotes.html index 628079978e..64c6acb25a 100644 --- a/docs/ReleaseNotes.html +++ b/docs/ReleaseNotes.html @@ -125,6 +125,7 @@ following are now considered to be of production quality: <li>Generalized initializers</li> <li>Unrestricted unions</li> <li>User-defined literals</li> + <li>Forward-declared enumerations</li> </ul> <!-- = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = --> diff --git a/include/clang/Basic/DiagnosticSemaKinds.td b/include/clang/Basic/DiagnosticSemaKinds.td index 36232b1e98..405ae906e5 100644 --- a/include/clang/Basic/DiagnosticSemaKinds.td +++ b/include/clang/Basic/DiagnosticSemaKinds.td @@ -1276,6 +1276,8 @@ def err_enum_class_reference : Error< "not 'enum class'">; def err_only_enums_have_underlying_types : Error< "only enumeration types have underlying types">; +def err_unscoped_enum_defined_out_of_class : Error< + "out-of-line definition of unscoped enumeration member is not supported">; // C++11 delegating constructors def err_delegating_ctor : Error< diff --git a/lib/Sema/SemaDecl.cpp b/lib/Sema/SemaDecl.cpp index 71f567f47a..68b27ef1f9 100644 --- a/lib/Sema/SemaDecl.cpp +++ b/lib/Sema/SemaDecl.cpp @@ -8260,10 +8260,11 @@ Decl *Sema::ActOnTag(Scope *S, unsigned TagSpec, TagUseKind TUK, EnumUnderlyingTy = QualType(T, 0); // All conflicts with previous declarations are recovered by - // returning the previous declaration. + // returning the previous declaration, unless this is a definition, + // in which case we want the caller to bail out. if (CheckEnumRedeclaration(NameLoc.isValid() ? NameLoc : KWLoc, ScopedEnum, EnumUnderlyingTy, PrevEnum)) - return PrevTagDecl; + return TUK == TUK_Declaration ? PrevTagDecl : 0; } if (!Invalid) { diff --git a/lib/Sema/SemaTemplateInstantiate.cpp b/lib/Sema/SemaTemplateInstantiate.cpp index afa65ea9ee..307cccce8b 100644 --- a/lib/Sema/SemaTemplateInstantiate.cpp +++ b/lib/Sema/SemaTemplateInstantiate.cpp @@ -1848,7 +1848,8 @@ Sema::InstantiateClass(SourceLocation PointOfInstantiation, // specialization causes the implicit instantiation of the definitions // of unscoped member enumerations. // Record a point of instantiation for this implicit instantiation. - if (TSK == TSK_ImplicitInstantiation && !Enum->isScoped()) { + if (TSK == TSK_ImplicitInstantiation && !Enum->isScoped() && + Enum->isCompleteDefinition()) { MemberSpecializationInfo *MSInfo =Enum->getMemberSpecializationInfo(); assert(MSInfo && "no spec info for member enum specialization"); MSInfo->setTemplateSpecializationKind(TSK_ImplicitInstantiation); diff --git a/test/SemaCXX/enum-scoped.cpp b/test/SemaCXX/enum-scoped.cpp index 31190bebaa..44394296e3 100644 --- a/test/SemaCXX/enum-scoped.cpp +++ b/test/SemaCXX/enum-scoped.cpp @@ -189,3 +189,14 @@ namespace test7 { enum class E { e = (struct S*)0 == (struct S*)0 }; S *p; } + +namespace test8 { + template<typename T> struct S { + enum A : int; // expected-note {{here}} + enum class B; // expected-note {{here}} + enum class C : int; // expected-note {{here}} + }; + template<typename T> enum S<T>::A { a }; // expected-error {{previously declared with fixed underlying type}} + template<typename T> enum class S<T>::B : char { b }; // expected-error {{redeclared with different underlying}} + template<typename T> enum S<T>::C : int { c }; // expected-error {{previously declared as scoped}} +} diff --git a/www/cxx_status.html b/www/cxx_status.html index 28da5f096b..8305b73ec6 100644 --- a/www/cxx_status.html +++ b/www/cxx_status.html @@ -158,7 +158,7 @@ with clang; other versions have not been tested.</p> <td>Forward declarations for enums</td> <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2764.pdf">N2764</a> <br><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#1206">DR1206</a></td> - <td class="none" align="center">No</td> + <td class="svn" align="center">SVN</td> </tr> <tr> <td>Generalized attributes</td> |