From 02bdb16524b952ae4ef459e066e29ee2232670df Mon Sep 17 00:00:00 2001 From: Fariborz Jahanian Date: Mon, 23 Sep 2013 20:27:06 +0000 Subject: [PATCH] ObjectiveC migrator: Infer NS_OPTIONS when if there is at least one hex enumerator, all others are also hex enumerator (0 enumerator is excepted). // rdar://15044304 llvm-svn: 191222 --- clang/lib/ARCMigrate/ObjCMT.cpp | 10 ++-- clang/test/ARCMT/objcmt-ns-macros.m | 58 ++++++++++++++++++++++ clang/test/ARCMT/objcmt-ns-macros.m.result | 58 ++++++++++++++++++++++ 3 files changed, 123 insertions(+), 3 deletions(-) diff --git a/clang/lib/ARCMigrate/ObjCMT.cpp b/clang/lib/ARCMigrate/ObjCMT.cpp index cffa625d3bd0..c29a2de46b5b 100644 --- a/clang/lib/ARCMigrate/ObjCMT.cpp +++ b/clang/lib/ARCMigrate/ObjCMT.cpp @@ -498,7 +498,7 @@ static bool rewriteToNSMacroDecl(const EnumDecl *EnumDcl, static bool UseNSOptionsMacro(Preprocessor &PP, ASTContext &Ctx, const EnumDecl *EnumDcl) { bool PowerOfTwo = true; - bool FoundHexdecimalEnumerator = false; + bool AllHexdecimalEnumerator = true; uint64_t MaxPowerOfTwoVal = 0; for (EnumDecl::enumerator_iterator EI = EnumDcl->enumerator_begin(), EE = EnumDcl->enumerator_end(); EI != EE; ++EI) { @@ -506,6 +506,7 @@ static bool UseNSOptionsMacro(Preprocessor &PP, ASTContext &Ctx, const Expr *InitExpr = Enumerator->getInitExpr(); if (!InitExpr) { PowerOfTwo = false; + AllHexdecimalEnumerator = false; continue; } InitExpr = InitExpr->IgnoreParenCasts(); @@ -520,7 +521,8 @@ static bool UseNSOptionsMacro(Preprocessor &PP, ASTContext &Ctx, else if (EnumVal > MaxPowerOfTwoVal) MaxPowerOfTwoVal = EnumVal; } - if (!FoundHexdecimalEnumerator) { + if (AllHexdecimalEnumerator && EnumVal) { + bool FoundHexdecimalEnumerator = false; SourceLocation EndLoc = Enumerator->getLocEnd(); Token Tok; if (!PP.getRawToken(EndLoc, Tok, /*IgnoreWhiteSpace=*/true)) @@ -529,9 +531,11 @@ static bool UseNSOptionsMacro(Preprocessor &PP, ASTContext &Ctx, FoundHexdecimalEnumerator = (StringLit[0] == '0' && (toLowercase(StringLit[1]) == 'x')); } + if (!FoundHexdecimalEnumerator) + AllHexdecimalEnumerator = false; } } - return FoundHexdecimalEnumerator || (PowerOfTwo && (MaxPowerOfTwoVal > 2)); + return AllHexdecimalEnumerator || (PowerOfTwo && (MaxPowerOfTwoVal > 2)); } void ObjCMigrateASTConsumer::migrateProtocolConformance(ASTContext &Ctx, diff --git a/clang/test/ARCMT/objcmt-ns-macros.m b/clang/test/ARCMT/objcmt-ns-macros.m index edc3ffd40439..6ee4625128ab 100644 --- a/clang/test/ARCMT/objcmt-ns-macros.m +++ b/clang/test/ARCMT/objcmt-ns-macros.m @@ -146,3 +146,61 @@ enum { }; typedef NSUInteger NSFOptions; + +typedef enum { + UIP0One = 0, + UIP0Two = 1, + UIP0Three = 2, + UIP0Four = 10, + UIP0Last = 0x100 +} UIP; + +typedef enum { + UIPZero = 0x0, + UIPOne = 0x1, + UIPTwo = 0x2, + UIP10 = 0x10, + UIPHundred = 0x100 +} UIP_3; + +typedef enum { + UIP4Zero = 0x0, + UIP4One = 0x1, + UIP4Two = 0x2, + UIP410 = 0x10, + UIP4Hundred = 100 +} UIP4_3; + +typedef enum { + UIP5Zero = 0x0, + UIP5Two = 0x2, + UIP510 = 0x3, + UIP5Hundred = 0x4 +} UIP5_3; + +typedef enum { + UIP6Zero = 0x0, + UIP6One = 0x1, + UIP6Two = 0x2, + UIP610 = 10, + UIP6Hundred = 0x100 +} UIP6_3; + +typedef enum { + UIP7Zero = 0x0, + UIP7One = 1, + UIP7Two = 0x2, + UIP710 = 10, + UIP7Hundred = 100 +} UIP7_3; + + +typedef enum { + Random = 0, + Random1 = 2, + Random2 = 4, + Random3 = 0x12345, + Random4 = 0x3444444, + Random5 = 0xbadbeef, + Random6 +} UIP8_3; diff --git a/clang/test/ARCMT/objcmt-ns-macros.m.result b/clang/test/ARCMT/objcmt-ns-macros.m.result index 674de3e9168d..e6318f2e2bfc 100644 --- a/clang/test/ARCMT/objcmt-ns-macros.m.result +++ b/clang/test/ARCMT/objcmt-ns-macros.m.result @@ -146,3 +146,61 @@ typedef NS_OPTIONS(NSUInteger, NSFOptions) { }; + +typedef NS_ENUM(NSInteger, UIP) { + UIP0One = 0, + UIP0Two = 1, + UIP0Three = 2, + UIP0Four = 10, + UIP0Last = 0x100 +} ; + +typedef NS_OPTIONS(NSUInteger, UIP_3) { + UIPZero = 0x0, + UIPOne = 0x1, + UIPTwo = 0x2, + UIP10 = 0x10, + UIPHundred = 0x100 +} ; + +typedef NS_ENUM(NSInteger, UIP4_3) { + UIP4Zero = 0x0, + UIP4One = 0x1, + UIP4Two = 0x2, + UIP410 = 0x10, + UIP4Hundred = 100 +} ; + +typedef NS_OPTIONS(NSUInteger, UIP5_3) { + UIP5Zero = 0x0, + UIP5Two = 0x2, + UIP510 = 0x3, + UIP5Hundred = 0x4 +} ; + +typedef NS_ENUM(NSInteger, UIP6_3) { + UIP6Zero = 0x0, + UIP6One = 0x1, + UIP6Two = 0x2, + UIP610 = 10, + UIP6Hundred = 0x100 +} ; + +typedef NS_ENUM(NSInteger, UIP7_3) { + UIP7Zero = 0x0, + UIP7One = 1, + UIP7Two = 0x2, + UIP710 = 10, + UIP7Hundred = 100 +} ; + + +typedef NS_ENUM(NSInteger, UIP8_3) { + Random = 0, + Random1 = 2, + Random2 = 4, + Random3 = 0x12345, + Random4 = 0x3444444, + Random5 = 0xbadbeef, + Random6 +} ;