From: Fariborz Jahanian Date: Wed, 11 Apr 2012 21:12:36 +0000 (+0000) Subject: modern objective-c translator. Fixes a translation bug when X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=acee1c9dbe180c6493d1bcda6a0a7ee4018ed7b1;p=clang modern objective-c translator. Fixes a translation bug when 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 --- diff --git a/lib/Rewrite/RewriteModernObjC.cpp b/lib/Rewrite/RewriteModernObjC.cpp index 4be7eb806f..fd433f88c2 100644 --- a/lib/Rewrite/RewriteModernObjC.cpp +++ b/lib/Rewrite/RewriteModernObjC.cpp @@ -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 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; diff --git a/test/Rewriter/rewrite-modern-ivars-2.mm b/test/Rewriter/rewrite-modern-ivars-2.mm index 643d4518e4..0faed5c55c 100644 --- a/test/Rewriter/rewrite-modern-ivars-2.mm +++ b/test/Rewriter/rewrite-modern-ivars-2.mm @@ -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 +