]> granicus.if.org Git - clang/commitdiff
Type::isArithmeticType(): disallow incomplete enum decls.
authorSteve Naroff <snaroff@apple.com>
Wed, 16 Jan 2008 23:54:22 +0000 (23:54 +0000)
committerSteve Naroff <snaroff@apple.com>
Wed, 16 Jan 2008 23:54:22 +0000 (23:54 +0000)
Bug submitted by Eli.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@46102 91177308-0d34-0410-b5e6-96231b3b80d8

AST/Type.cpp
include/clang/AST/Decl.h
test/Sema/enum.c

index 78e0dbbb27193f31eae07d4b9b566d22c0cfae58..e59569d2d64bff1fa2430406665e8525400ed139 100644 (file)
@@ -444,8 +444,11 @@ bool Type::isArithmeticType() const {
   if (const BuiltinType *BT = dyn_cast<BuiltinType>(CanonicalType))
     return BT->getKind() != BuiltinType::Void;
   if (const TagType *TT = dyn_cast<TagType>(CanonicalType))
-    if (TT->getDecl()->getKind() == Decl::Enum)
-      return true;
+    if (const EnumDecl *ED = dyn_cast<EnumDecl>(TT->getDecl()))
+      // GCC allows forward declaration of enum types (forbid by C99 6.7.2.3p2).
+      // If a body isn't seen by the time we get here, we exclude it from
+      // being allowed in arithmetic expressions.
+      return ED->isDefinition();
   return isa<ComplexType>(CanonicalType) || isa<VectorType>(CanonicalType);
 }
 
index 40af7bada0bd8d26fcc23fd980271e8511d137cf..0bd250d99b676b264bca28c6291eb0d86788fab3 100644 (file)
@@ -663,6 +663,7 @@ public:
   EnumDecl(SourceLocation L, IdentifierInfo *Id, ScopedDecl *PrevDecl)
     : TagDecl(Enum, L, Id, PrevDecl) {
     ElementList = 0;
+       IntegerType = QualType();
   }
   
   /// defineElements - When created, EnumDecl correspond to a forward declared
index 79a92c8f2d4932f7db358ebfad4da3a01647ce2d..169c394c50fa041a5a6fe88e8782071903457891 100644 (file)
@@ -22,3 +22,9 @@ int test() {
   return sizeof(enum e) ;
 }
 
+enum gccForwardEnumExtension ve; // expected-warning {{ISO C forbids forward references to 'enum' types}}
+
+int test2(int i)
+{
+  ve + i; // expected-error{{invalid operands to binary expression ('enum gccForwardEnumExtension' and 'int')}}
+}