ObjectiveC migrator: In deciding NS_OPTION over
authorFariborz Jahanian <fjahanian@apple.com>
Thu, 15 Aug 2013 18:46:37 +0000 (18:46 +0000)
committerFariborz Jahanian <fjahanian@apple.com>
Thu, 15 Aug 2013 18:46:37 +0000 (18:46 +0000)
NS_ENUM, at least one power of 2 enumerator
must be greater than two.

llvm-svn: 188470

clang/lib/ARCMigrate/ObjCMT.cpp
clang/test/ARCMT/objcmt-ns-macros.m
clang/test/ARCMT/objcmt-ns-macros.m.result

index ca86d12466f04e41d9850ade7509be15fb917573..05a81393eabfa5b81517cd21dd995702eba51850 100644 (file)
@@ -493,6 +493,7 @@ static bool rewriteToNSMacroDecl(const EnumDecl *EnumDcl,
 static bool UseNSOptionsMacro(ASTContext &Ctx,
                               const EnumDecl *EnumDcl) {
   bool PowerOfTwo = true;
+  uint64_t MaxPowerOfTwoVal = 0;
   for (EnumDecl::enumerator_iterator EI = EnumDcl->enumerator_begin(),
        EE = EnumDcl->enumerator_end(); EI != EE; ++EI) {
     EnumConstantDecl *Enumerator = (*EI);
@@ -507,10 +508,14 @@ static bool UseNSOptionsMacro(ASTContext &Ctx,
         return true;
     
     uint64_t EnumVal = Enumerator->getInitVal().getZExtValue();
-    if (PowerOfTwo && EnumVal && !llvm::isPowerOf2_64(EnumVal))
-      PowerOfTwo = false;
+    if (PowerOfTwo && EnumVal) {
+      if (!llvm::isPowerOf2_64(EnumVal))
+        PowerOfTwo = false;
+      else if (EnumVal > MaxPowerOfTwoVal)
+        MaxPowerOfTwoVal = EnumVal;
+    }
   }
-  return PowerOfTwo;
+  return PowerOfTwo ? ((MaxPowerOfTwoVal > 2) ? true : false) : false;
 }
 
 void ObjCMigrateASTConsumer::migrateProtocolConformance(ASTContext &Ctx,   
index 2ca85699fb9d180d7a5c67b80dfc7d57299c4c3f..26d5c33a55ab3bb32bf4d28bcd1c24db13987fdb 100644 (file)
@@ -64,3 +64,9 @@ enum {
   UNTwo
 };
 
+// Should use NS_ENUM even though it is all power of 2.
+enum {
+  UIKOne = 0x1,
+  UIKTwo = 0x2,
+};
+typedef NSInteger UIK;
index efd4fe8cecabffd29abc43018c0c58ff9fe430c6..b163cfbee1a2155a72b53c2b1e10e392c8eec870 100644 (file)
@@ -64,3 +64,9 @@ enum {
   UNTwo
 };
 
+// Should use NS_ENUM even though it is all power of 2.
+typedef NS_ENUM(NSInteger, UIK) {
+  UIKOne = 0x1,
+  UIKTwo = 0x2,
+};
+