From: Steve Naroff Date: Thu, 14 Aug 2008 15:00:38 +0000 (+0000) Subject: Fix ASTContext::getObjCEncodingForType() to limit the type info for structure bodies... X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=faf37e7d3646c4f473e7a565a9a2f8baed62dbe6;p=clang Fix ASTContext::getObjCEncodingForType() to limit the type info for structure bodies (mimics gcc's adhoc rules). This fixes clang ObjC rewriter: If a class contains a struct ivar with a lot of members, ... git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@54777 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/AST/ASTContext.cpp b/lib/AST/ASTContext.cpp index 7ff4ae9165..fa3139c500 100644 --- a/lib/AST/ASTContext.cpp +++ b/lib/AST/ASTContext.cpp @@ -1485,6 +1485,11 @@ void ASTContext::getObjCEncodingForType(QualType T, std::string& S, S += '?'; } else if (const RecordType *RTy = T->getAsRecordType()) { RecordDecl *RDecl= RTy->getDecl(); + // This mimics the behavior in gcc's encode_aggregate_within(). + // The idea is to only inline structure definitions for top level pointers + // to structures and embedded structures. + bool inlining = (S.size() == 1 && S[0] == '^' || + S.size() > 1 && S[S.size()-1] != '^'); S += '{'; S += RDecl->getName(); bool found = false; @@ -1493,7 +1498,7 @@ void ASTContext::getObjCEncodingForType(QualType T, std::string& S, found = true; break; } - if (!found) { + if (!found && inlining) { ERType.push_back(RTy); S += '='; for (int i = 0; i < RDecl->getNumMembers(); i++) {