]> granicus.if.org Git - clang/commitdiff
modern objective-c translator. Fixes a translation bug when
authorFariborz Jahanian <fjahanian@apple.com>
Wed, 11 Apr 2012 21:12:36 +0000 (21:12 +0000)
committerFariborz Jahanian <fjahanian@apple.com>
Wed, 11 Apr 2012 21:12:36 +0000 (21:12 +0000)
first ivar in the list is a bitfield.
// rdar://11229770

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@154534 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Rewrite/RewriteModernObjC.cpp
test/Rewriter/rewrite-modern-ivars-2.mm

index 4be7eb806f49455b5be753653dba7868975da966..fd433f88c2e90370a162d02b07014064d38579f3 100644 (file)
@@ -6416,7 +6416,8 @@ static void Write__extendedMethodTypes_initializer(RewriteModernObjC &RewriteObj
   }
 }
 
-static void Write_IvarOffsetVar(ASTContext *Context,
+static void Write_IvarOffsetVar(RewriteModernObjC &RewriteObj,
+                                ASTContext *Context,
                                 std::string &Result, 
                                 ArrayRef<ObjCIvarDecl *> Ivars, 
                                 ObjCInterfaceDecl *CDecl) {
@@ -6446,17 +6447,8 @@ static void Write_IvarOffsetVar(ASTContext *Context,
     WriteInternalIvarName(CDecl, IvarDecl, Result);
     Result += " __attribute__ ((used, section (\"__DATA,__objc_ivar\")))";
     Result += " = ";
-    if (IvarDecl->isBitField()) {
-      // FIXME: The hack below doesn't work for bitfields. For now, we simply
-      // place all bitfields at offset 0.
-      Result += "0;\n";
-    }
-    else {
-      Result += "__OFFSETOFIVAR__(struct ";
-      Result += CDecl->getNameAsString();
-      Result += "_IMPL, "; 
-      Result += IvarDecl->getName(); Result += ");\n";
-    }
+    RewriteObj.RewriteIvarOffsetComputation(IvarDecl, Result);
+    Result += ";\n";
   }
 }
 
@@ -6466,7 +6458,7 @@ static void Write__ivar_list_t_initializer(RewriteModernObjC &RewriteObj,
                                            StringRef VarName,
                                            ObjCInterfaceDecl *CDecl) {
   if (Ivars.size() > 0) {
-    Write_IvarOffsetVar(Context, Result, Ivars, CDecl);
+    Write_IvarOffsetVar(RewriteObj, Context, Result, Ivars, CDecl);
     
     Result += "\nstatic ";
     Write__ivar_list_t_TypeDecl(Result, Ivars.size());
@@ -6875,11 +6867,7 @@ void RewriteModernObjC::RewriteObjCClassMetaData(ObjCImplementationDecl *IDecl,
     
     ObjCIvarDecl *IVD = CDecl->all_declared_ivar_begin();
     if (IVD) {
-      InstanceStart += "__OFFSETOFIVAR__(struct ";
-      InstanceStart += CDecl->getNameAsString();
-      InstanceStart += "_IMPL, ";
-      InstanceStart += IVD->getNameAsString();
-      InstanceStart += ")";
+      RewriteIvarOffsetComputation(IVD, InstanceStart);
     }
     else 
       InstanceStart = InstanceSize;
index 643d4518e416165f0600488070c1a1ab0f578068..0faed5c55cc2acfb0977aaf67933940405a05c20 100644 (file)
@@ -71,3 +71,31 @@ typedef unsigned int FSCatalogInfoBitmap;
 
 @implementation NSFileLocationComponent @end
 
+// rdar://11229770
+
+@interface Foo {
+  int bar:26;
+}
+@end
+
+@implementation Foo
+@end
+
+@interface Foo1 {
+  int bar:26;
+  int bar2:4;
+}
+@end
+
+@implementation Foo1
+@end
+
+@interface Foo3 {
+  int foo;
+  int bar:26;
+}
+@end
+
+@implementation Foo3
+@end
+