From: Fariborz Jahanian Date: Thu, 15 Aug 2013 18:46:37 +0000 (+0000) Subject: ObjectiveC migrator: In deciding NS_OPTION over X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=0b5941c2a6ce99f0dc0dc8b64024eeabbbb6db1d;p=clang 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 ca86d12466..05a81393ea 100644 --- a/lib/ARCMigrate/ObjCMT.cpp +++ b/lib/ARCMigrate/ObjCMT.cpp @@ -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, diff --git a/test/ARCMT/objcmt-ns-macros.m b/test/ARCMT/objcmt-ns-macros.m index 2ca85699fb..26d5c33a55 100644 --- a/test/ARCMT/objcmt-ns-macros.m +++ b/test/ARCMT/objcmt-ns-macros.m @@ -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; diff --git a/test/ARCMT/objcmt-ns-macros.m.result b/test/ARCMT/objcmt-ns-macros.m.result index efd4fe8cec..b163cfbee1 100644 --- a/test/ARCMT/objcmt-ns-macros.m.result +++ b/test/ARCMT/objcmt-ns-macros.m.result @@ -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, +}; +