ObjectiveC migrator: In deciding NS_OPTION over
NS_ENUM, at least one power of 2 enumerator
must be greater than two.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@188470 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/ARCMigrate/ObjCMT.cpp b/lib/ARCMigrate/ObjCMT.cpp
index ca86d12..05a8139 100644
--- a/lib/ARCMigrate/ObjCMT.cpp
+++ b/lib/ARCMigrate/ObjCMT.cpp
@@ -493,6 +493,7 @@
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 @@
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,
diff --git a/test/ARCMT/objcmt-ns-macros.m b/test/ARCMT/objcmt-ns-macros.m
index 2ca8569..26d5c33 100644
--- a/test/ARCMT/objcmt-ns-macros.m
+++ b/test/ARCMT/objcmt-ns-macros.m
@@ -64,3 +64,9 @@
UNTwo
};
+// Should use NS_ENUM even though it is all power of 2.
+enum {
+ UIKOne = 0x1,
+ UIKTwo = 0x2,
+};
+typedef NSInteger UIK;
diff --git a/test/ARCMT/objcmt-ns-macros.m.result b/test/ARCMT/objcmt-ns-macros.m.result
index efd4fe8..b163cfb 100644
--- a/test/ARCMT/objcmt-ns-macros.m.result
+++ b/test/ARCMT/objcmt-ns-macros.m.result
@@ -64,3 +64,9 @@
UNTwo
};
+// Should use NS_ENUM even though it is all power of 2.
+typedef NS_ENUM(NSInteger, UIK) {
+ UIKOne = 0x1,
+ UIKTwo = 0x2,
+};
+