]> granicus.if.org Git - clang/commitdiff
Scoped enumerations should not be treated as integer types (in the C
authorDouglas Gregor <dgregor@apple.com>
Thu, 5 May 2011 16:13:52 +0000 (16:13 +0000)
committerDouglas Gregor <dgregor@apple.com>
Thu, 5 May 2011 16:13:52 +0000 (16:13 +0000)
sense). Fixes <rdar://problem/9366066> by eliminating an inconsistency
between C++ overloading (which handled scoped enumerations correctly)
and C binary operator type-checking (which didn't).

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

lib/AST/Type.cpp
test/SemaCXX/enum-scoped.cpp

index 9eb497bea6296d0ca444335eb89ae027dd990f1a..ed2223559394e7ca5929cfa363433b588be0fc30 100644 (file)
@@ -517,7 +517,7 @@ bool Type::isIntegerType() const {
   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.
-    return ET->getDecl()->isComplete();
+    return ET->getDecl()->isComplete() && !ET->getDecl()->isScoped();
   return false;
 }
 
@@ -641,7 +641,7 @@ bool Type::isSignedIntegerType() const {
   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())
+    if (ET->getDecl()->isComplete() && !ET->getDecl()->isScoped())
       return ET->getDecl()->getIntegerType()->isSignedIntegerType();
   }
 
@@ -667,7 +667,7 @@ bool Type::isUnsignedIntegerType() const {
   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())
+    if (ET->getDecl()->isComplete() && !ET->getDecl()->isScoped())
       return ET->getDecl()->getIntegerType()->isUnsignedIntegerType();
   }
 
index 8c4bfe72d3e2c4cd19da91d4da24ab5c8e9c1a1a..fc871cf379206dcc45626c3efb517388eb00bc78 100644 (file)
@@ -109,3 +109,13 @@ void PR9333() {
   scoped_enum e = scoped_enum::yes;
   if (e == scoped_enum::no) { }
 }
+
+// <rdar://problem/9366066>
+namespace rdar9366066 {
+  enum class X : unsigned { value };
+
+  void f(X x) {
+    x % X::value; // expected-error{{invalid operands to binary expression ('rdar9366066::X' and 'rdar9366066::X')}}
+    x % 8; // expected-error{{invalid operands to binary expression ('rdar9366066::X' and 'int')}}
+  }
+}