forked from OSchip/llvm-project
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, ... llvm-svn: 54777
This commit is contained in:
parent
89d6c9f698
commit
40471b3ba8
|
@ -1485,6 +1485,11 @@ void ASTContext::getObjCEncodingForType(QualType T, std::string& S,
|
||||||
S += '?';
|
S += '?';
|
||||||
} else if (const RecordType *RTy = T->getAsRecordType()) {
|
} else if (const RecordType *RTy = T->getAsRecordType()) {
|
||||||
RecordDecl *RDecl= RTy->getDecl();
|
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 += '{';
|
||||||
S += RDecl->getName();
|
S += RDecl->getName();
|
||||||
bool found = false;
|
bool found = false;
|
||||||
|
@ -1493,7 +1498,7 @@ void ASTContext::getObjCEncodingForType(QualType T, std::string& S,
|
||||||
found = true;
|
found = true;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (!found) {
|
if (!found && inlining) {
|
||||||
ERType.push_back(RTy);
|
ERType.push_back(RTy);
|
||||||
S += '=';
|
S += '=';
|
||||||
for (int i = 0; i < RDecl->getNumMembers(); i++) {
|
for (int i = 0; i < RDecl->getNumMembers(); i++) {
|
||||||
|
|
Loading…
Reference in New Issue