diff options
author | Douglas Gregor <dgregor@apple.com> | 2010-07-13 06:24:26 +0000 |
---|---|---|
committer | Douglas Gregor <dgregor@apple.com> | 2010-07-13 06:24:26 +0000 |
commit | a131d0fc0af9f79c90e7654231041b2495d355a9 (patch) | |
tree | aaed8f10227cce77b594df588d2c05b50dc7cb0b | |
parent | 44eac33ae12df384f3f002102f919f603bee330f (diff) |
Complain when an unnamed enumeration has no enumerations (in
C++). Fixes PR7466.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@108231 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/Sema/SemaDecl.cpp | 8 | ||||
-rw-r--r-- | test/Parser/cxx-class.cpp | 2 | ||||
-rw-r--r-- | test/SemaCXX/enum.cpp | 4 |
3 files changed, 13 insertions, 1 deletions
diff --git a/lib/Sema/SemaDecl.cpp b/lib/Sema/SemaDecl.cpp index 318ae494f1..7d90792376 100644 --- a/lib/Sema/SemaDecl.cpp +++ b/lib/Sema/SemaDecl.cpp @@ -1539,6 +1539,14 @@ Sema::DeclPtrTy Sema::ParsedFreeStandingDeclSpec(Scope *S, AccessSpecifier AS, return DeclPtrTy::make(Tag); } + if (getLangOptions().CPlusPlus && + DS.getStorageClassSpec() != DeclSpec::SCS_typedef) + if (EnumDecl *Enum = dyn_cast_or_null<EnumDecl>(Tag)) + if (Enum->enumerator_begin() == Enum->enumerator_end() && + !Enum->getIdentifier() && !Enum->isInvalidDecl()) + Diag(Enum->getLocation(), diag::ext_no_declarators) + << DS.getSourceRange(); + if (!DS.isMissingDeclaratorOk() && DS.getTypeSpecType() != DeclSpec::TST_error) { // Warn about typedefs of enums without names, since this is an diff --git a/test/Parser/cxx-class.cpp b/test/Parser/cxx-class.cpp index 4abbbc5b9b..57831a463b 100644 --- a/test/Parser/cxx-class.cpp +++ b/test/Parser/cxx-class.cpp @@ -7,7 +7,7 @@ protected: static int sf(), u; struct S {}; - enum {}; + enum {}; // expected-warning{{declaration does not declare anything}} int; // expected-warning {{declaration does not declare anything}} int : 1, : 2; diff --git a/test/SemaCXX/enum.cpp b/test/SemaCXX/enum.cpp index 3a66617e0d..0690ead250 100644 --- a/test/SemaCXX/enum.cpp +++ b/test/SemaCXX/enum.cpp @@ -81,3 +81,7 @@ namespace PR7051 { e |= 1; // expected-error{{assigning to 'PR7051::E' from incompatible type 'int'}} } } + +// PR7466 +enum { }; // expected-warning{{declaration does not declare anything}} +typedef enum { }; // expected-warning{{typedef requires a name}} |