diff options
| author | Fariborz Jahanian <fjahanian@apple.com> | 2012-05-02 17:34:59 +0000 |
|---|---|---|
| committer | Fariborz Jahanian <fjahanian@apple.com> | 2012-05-02 17:34:59 +0000 |
| commit | d7c6777d504013bee96bfe9a50f9e34b309218c8 (patch) | |
| tree | ad40dca66a3853da955989a0fed43b770942e45a /clang/lib/Rewrite/RewriteModernObjC.cpp | |
| parent | 377f99bc680ad47c6b3a5aa8cbb065b8c115148d (diff) | |
| download | bcm5719-llvm-d7c6777d504013bee96bfe9a50f9e34b309218c8.tar.gz bcm5719-llvm-d7c6777d504013bee96bfe9a50f9e34b309218c8.zip | |
Modern objective-c translation: Fixing couple of bugs
related to laying out ivar structs and accessing non-fragile-ivar
in more compilated cases. // rdar://11323187
llvm-svn: 156004
Diffstat (limited to 'clang/lib/Rewrite/RewriteModernObjC.cpp')
| -rw-r--r-- | clang/lib/Rewrite/RewriteModernObjC.cpp | 16 |
1 files changed, 14 insertions, 2 deletions
diff --git a/clang/lib/Rewrite/RewriteModernObjC.cpp b/clang/lib/Rewrite/RewriteModernObjC.cpp index 66069766bb5..410e68908d1 100644 --- a/clang/lib/Rewrite/RewriteModernObjC.cpp +++ b/clang/lib/Rewrite/RewriteModernObjC.cpp @@ -3523,6 +3523,11 @@ bool RewriteModernObjC::IsTagDefinedInsideClass(ObjCContainerDecl *IDecl, /// It handles elaborated types, as well as enum types in the process. bool RewriteModernObjC::RewriteObjCFieldDeclType(QualType &Type, std::string &Result) { + if (isa<TypedefType>(Type)) { + Result += "\t"; + return false; + } + if (Type->isArrayType()) { QualType ElemTy = Context->getBaseElementType(Type); return RewriteObjCFieldDeclType(ElemTy, Result); @@ -3618,6 +3623,8 @@ void RewriteModernObjC::RewriteObjCFieldDecl(FieldDecl *fieldDecl, void RewriteModernObjC::RewriteLocallyDefinedNamedAggregates(FieldDecl *fieldDecl, std::string &Result) { QualType Type = fieldDecl->getType(); + if (isa<TypedefType>(Type)) + return; if (Type->isArrayType()) Type = Context->getBaseElementType(Type); ObjCContainerDecl *IDecl = @@ -7308,12 +7315,17 @@ Stmt *RewriteModernObjC::RewriteObjCIvarRefExpr(ObjCIvarRefExpr *IV) { addExpr); QualType IvarT = D->getType(); - if (IvarT->isRecordType()) { + if (!isa<TypedefType>(IvarT) && IvarT->isRecordType()) { RecordDecl *RD = IvarT->getAs<RecordType>()->getDecl(); RD = RD->getDefinition(); if (RD && !RD->getDeclName().getAsIdentifierInfo()) { // decltype(((Foo_IMPL*)0)->bar) * - std::string RecName = iFaceDecl->getDecl()->getName(); + ObjCContainerDecl *CDecl = + dyn_cast<ObjCContainerDecl>(D->getDeclContext()); + // ivar in class extensions requires special treatment. + if (ObjCCategoryDecl *CatDecl = dyn_cast<ObjCCategoryDecl>(CDecl)) + CDecl = CatDecl->getClassInterface(); + std::string RecName = CDecl->getName(); RecName += "_IMPL"; RecordDecl *RD = RecordDecl::Create(*Context, TTK_Struct, TUDecl, SourceLocation(), SourceLocation(), |

