diff options
-rw-r--r-- | lib/AST/Type.cpp | 11 | ||||
-rw-r--r-- | test/Sema/enum.c | 6 | ||||
-rw-r--r-- | test/SemaCXX/enum.cpp | 5 |
3 files changed, 18 insertions, 4 deletions
diff --git a/lib/AST/Type.cpp b/lib/AST/Type.cpp index 4ab463699c..c2fc69fd2d 100644 --- a/lib/AST/Type.cpp +++ b/lib/AST/Type.cpp @@ -460,10 +460,13 @@ bool Type::isIntegralOrEnumerationType() const { if (const BuiltinType *BT = dyn_cast<BuiltinType>(CanonicalType)) return BT->getKind() >= BuiltinType::Bool && BT->getKind() <= BuiltinType::Int128; - - if (isa<EnumType>(CanonicalType)) - return true; - + + // Check for a complete enum type; incomplete enum types are not properly an + // enumeration type in the sense required here. + if (const TagType *TT = dyn_cast<TagType>(CanonicalType)) + if (TT->getDecl()->isEnum() && TT->getDecl()->isDefinition()) + return true; + return false; } diff --git a/test/Sema/enum.c b/test/Sema/enum.c index 057015011e..64aa31bc4b 100644 --- a/test/Sema/enum.c +++ b/test/Sema/enum.c @@ -96,3 +96,9 @@ char * s = (an_enum) an_enumerator; // expected-warning {{incompatible integer t // PR4515 enum PR4515 {PR4515a=1u,PR4515b=(PR4515a-2)/2}; int CheckPR4515[PR4515b==0?1:-1]; + +// PR7911 +extern enum PR7911T PR7911V; // expected-warning{{ISO C forbids forward references to 'enum' types}} +void PR7911F() { + switch (PR7911V); // expected-error {{statement requires expression of integer type}} +} diff --git a/test/SemaCXX/enum.cpp b/test/SemaCXX/enum.cpp index 0690ead250..1dc55e3916 100644 --- a/test/SemaCXX/enum.cpp +++ b/test/SemaCXX/enum.cpp @@ -85,3 +85,8 @@ namespace PR7051 { // PR7466 enum { }; // expected-warning{{declaration does not declare anything}} typedef enum { }; // expected-warning{{typedef requires a name}} + +// PR7921 +enum PR7921E { + PR7921V = (PR7921E)(123) // expected-error {{expression is not an integer constant expression}} +}; |