]> granicus.if.org Git - clang/commitdiff
Incomplete enum types not to be treated as integer type
authorFariborz Jahanian <fjahanian@apple.com>
Mon, 29 Nov 2010 23:18:09 +0000 (23:18 +0000)
committerFariborz Jahanian <fjahanian@apple.com>
Mon, 29 Nov 2010 23:18:09 +0000 (23:18 +0000)
when checking for integer signed/unsigned-ness. PR8694,
// rdar://8707031

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

lib/AST/Type.cpp
test/Sema/enum.c

index 3c9561cd44b5b6c0f01302b4fe8ca9ca2e5cefb4..56cd4dddb5c6b8f45212346af1ee2e387b090859 100644 (file)
@@ -489,8 +489,12 @@ bool Type::isSignedIntegerType() const {
            BT->getKind() <= BuiltinType::Int128;
   }
 
-  if (const EnumType *ET = dyn_cast<EnumType>(CanonicalType))
-    return ET->getDecl()->getIntegerType()->isSignedIntegerType();
+  if (const EnumType *ET = dyn_cast<EnumType>(CanonicalType)) {
+    // Incomplete enum types are not treated as integer types.
+    // FIXME: In C++, enum types are never integer types.
+    if (ET->getDecl()->isComplete())
+      return ET->getDecl()->getIntegerType()->isSignedIntegerType();
+  }
 
   return false;
 }
@@ -511,8 +515,12 @@ bool Type::isUnsignedIntegerType() const {
            BT->getKind() <= BuiltinType::UInt128;
   }
 
-  if (const EnumType *ET = dyn_cast<EnumType>(CanonicalType))
-    return ET->getDecl()->getIntegerType()->isUnsignedIntegerType();
+  if (const EnumType *ET = dyn_cast<EnumType>(CanonicalType)) {
+    // Incomplete enum types are not treated as integer types.
+    // FIXME: In C++, enum types are never integer types.
+    if (ET->getDecl()->isComplete())
+      return ET->getDecl()->getIntegerType()->isUnsignedIntegerType();
+  }
 
   return false;
 }
index d83b06f56bad9c265ae6c7972ad4689e019893f4..a95efb035db1bae01fc925f16d00d8b3614133ff 100644 (file)
@@ -104,3 +104,16 @@ void PR7911F() {
 }
 
 char test5[__has_feature(enumerator_attributes) ? 1 : -1];
+
+// PR8694
+// rdar://8707031
+void PR8694(int* e) // expected-note {{passing argument to parameter 'e' here}}
+{
+}
+
+void crash(enum E* e) // expected-warning {{declaration of 'enum E' will not be visible outside of this function}} \
+                      // expected-warning {{ISO C forbids forward references to 'enum' types}}
+{
+        PR8694(e); // expected-warning {{incompatible pointer types passing 'enum E *' to parameter of type 'int *'}}
+}
+