summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFariborz Jahanian <fjahanian@apple.com>2013-09-23 20:27:06 +0000
committerFariborz Jahanian <fjahanian@apple.com>2013-09-23 20:27:06 +0000
commit02bdb16524b952ae4ef459e066e29ee2232670df (patch)
treea4e72c63b7f5a10e692ce5604237888bec9cce93
parent724d75b2c8fe6bb4917c5c4acf011750df41e9e8 (diff)
downloadbcm5719-llvm-02bdb16524b952ae4ef459e066e29ee2232670df.tar.gz
bcm5719-llvm-02bdb16524b952ae4ef459e066e29ee2232670df.zip
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
-rw-r--r--clang/lib/ARCMigrate/ObjCMT.cpp10
-rw-r--r--clang/test/ARCMT/objcmt-ns-macros.m58
-rw-r--r--clang/test/ARCMT/objcmt-ns-macros.m.result58
3 files changed, 123 insertions, 3 deletions
diff --git a/clang/lib/ARCMigrate/ObjCMT.cpp b/clang/lib/ARCMigrate/ObjCMT.cpp
index cffa625d3bd..c29a2de46b5 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 edc3ffd4043..6ee4625128a 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 674de3e9168..e6318f2e2bf 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
+} ;
OpenPOWER on IntegriCloud