aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDouglas Gregor <dgregor@apple.com>2010-07-13 06:24:26 +0000
committerDouglas Gregor <dgregor@apple.com>2010-07-13 06:24:26 +0000
commita131d0fc0af9f79c90e7654231041b2495d355a9 (patch)
treeaaed8f10227cce77b594df588d2c05b50dc7cb0b
parent44eac33ae12df384f3f002102f919f603bee330f (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.cpp8
-rw-r--r--test/Parser/cxx-class.cpp2
-rw-r--r--test/SemaCXX/enum.cpp4
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}}