aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSteve Naroff <snaroff@apple.com>2008-08-14 15:00:38 +0000
committerSteve Naroff <snaroff@apple.com>2008-08-14 15:00:38 +0000
commitfaf37e7d3646c4f473e7a565a9a2f8baed62dbe6 (patch)
treea70513d9f735bcaf53440f3dd2dd371d615f8fe4
parentad2018f4cde3607e83d9ebb195a82cb87c98f236 (diff)
Fix ASTContext::getObjCEncodingForType() to limit the type info for structure bodies (mimics gcc's adhoc rules).
This fixes <rdar://problem/6140902> 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
-rw-r--r--lib/AST/ASTContext.cpp7
1 files changed, 6 insertions, 1 deletions
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++) {