r188470 - ObjectiveC migrator: In deciding NS_OPTION over

Fariborz Jahanian fjahanian at apple.com
Thu Aug 15 11:46:37 PDT 2013


Author: fjahanian
Date: Thu Aug 15 13:46:37 2013
New Revision: 188470

URL: http://llvm.org/viewvc/llvm-project?rev=188470&view=rev
Log:
ObjectiveC migrator: In deciding NS_OPTION over
NS_ENUM, at least one power of 2 enumerator 
must be greater than two.

Modified:
    cfe/trunk/lib/ARCMigrate/ObjCMT.cpp
    cfe/trunk/test/ARCMT/objcmt-ns-macros.m
    cfe/trunk/test/ARCMT/objcmt-ns-macros.m.result

Modified: cfe/trunk/lib/ARCMigrate/ObjCMT.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/ARCMigrate/ObjCMT.cpp?rev=188470&r1=188469&r2=188470&view=diff
==============================================================================
--- cfe/trunk/lib/ARCMigrate/ObjCMT.cpp (original)
+++ cfe/trunk/lib/ARCMigrate/ObjCMT.cpp Thu Aug 15 13:46:37 2013
@@ -493,6 +493,7 @@ static bool rewriteToNSMacroDecl(const E
 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
         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,   

Modified: cfe/trunk/test/ARCMT/objcmt-ns-macros.m
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/ARCMT/objcmt-ns-macros.m?rev=188470&r1=188469&r2=188470&view=diff
==============================================================================
--- cfe/trunk/test/ARCMT/objcmt-ns-macros.m (original)
+++ cfe/trunk/test/ARCMT/objcmt-ns-macros.m Thu Aug 15 13:46:37 2013
@@ -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;

Modified: cfe/trunk/test/ARCMT/objcmt-ns-macros.m.result
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/ARCMT/objcmt-ns-macros.m.result?rev=188470&r1=188469&r2=188470&view=diff
==============================================================================
--- cfe/trunk/test/ARCMT/objcmt-ns-macros.m.result (original)
+++ cfe/trunk/test/ARCMT/objcmt-ns-macros.m.result Thu Aug 15 13:46:37 2013
@@ -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,
+};
+





More information about the cfe-commits mailing list