From: Fariborz Jahanian Date: Fri, 12 Jul 2013 16:19:11 +0000 (+0000) Subject: Objective-C: Produce gcc compatible encoding of X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=361a329ee562fb3ed7a20ffddb9e98e71fa16a56;p=clang Objective-C: Produce gcc compatible encoding of ivar type in meta-data while preventing recursive encoding in a corner case. // rdar://14408244 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@186169 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/AST/ASTContext.cpp b/lib/AST/ASTContext.cpp index 933e5e057e..527a647701 100644 --- a/lib/AST/ASTContext.cpp +++ b/lib/AST/ASTContext.cpp @@ -5434,6 +5434,20 @@ void ASTContext::getObjCEncodingForTypeImpl(QualType T, std::string& S, // We encode the underlying type which comes out as // {...}; S += '^'; + if (FD && OPT->getInterfaceDecl()) { + // Prevent redursive encoding of fields in some rare cases. + ObjCInterfaceDecl *OI = OPT->getInterfaceDecl(); + SmallVector Ivars; + DeepCollectObjCIvars(OI, true, Ivars); + for (unsigned i = 0, e = Ivars.size(); i != e; ++i) { + if (cast(Ivars[i]) == FD) { + S += '{'; + S += OI->getIdentifier()->getName(); + S += '}'; + return; + } + } + } getObjCEncodingForTypeImpl(PointeeTy, S, false, ExpandPointedToStructures, NULL, diff --git a/test/CodeGenObjC/encode-test-6.m b/test/CodeGenObjC/encode-test-6.m index b7feb14434..b7b37997e1 100644 --- a/test/CodeGenObjC/encode-test-6.m +++ b/test/CodeGenObjC/encode-test-6.m @@ -35,3 +35,21 @@ typedef BABugExample BABugExampleRedefinition; @end // CHECK: internal global [24 x i8] c"^{BABugExample=@}16 + +// rdar://14408244 +@class SCNCamera; +typedef SCNCamera C3DCamera; +typedef struct +{ + C3DCamera *presentationInstance; +} C3DCameraStorage; + +@interface SCNCamera +@end + +@implementation SCNCamera +{ + C3DCameraStorage _storage; +} +@end +// CHECK: internal global [39 x i8] c"{?=\22presentationInstance\22^{SCNCamera}}\00"