After issuing diagnostics on circular protocol list,

don't build circular AST in protocol's protocol list 
when user code has introduced it. Indexer and other   
clients may crash. // rdar://9221614

llvm-svn: 131254
This commit is contained in:
Fariborz Jahanian
2011-05-12 22:04:39 +00:00
parent c61647d0a7
commit cadf7c57ad
2 changed files with 8 additions and 5 deletions

View File

@@ -4739,7 +4739,8 @@ public:
void CheckForwardProtocolDeclarationForCircularDependency(
IdentifierInfo *PName,
SourceLocation &PLoc, SourceLocation PrevLoc,
const ObjCList<ObjCProtocolDecl> &PList);
const ObjCList<ObjCProtocolDecl> &PList,
bool &err);
Decl *ActOnStartProtocolInterface(
SourceLocation AtProtoInterfaceLoc,

View File

@@ -275,7 +275,7 @@ Decl *Sema::ActOnCompatiblityAlias(SourceLocation AtLoc,
void Sema::CheckForwardProtocolDeclarationForCircularDependency(
IdentifierInfo *PName,
SourceLocation &Ploc, SourceLocation PrevLoc,
const ObjCList<ObjCProtocolDecl> &PList) {
const ObjCList<ObjCProtocolDecl> &PList, bool &err) {
for (ObjCList<ObjCProtocolDecl>::iterator I = PList.begin(),
E = PList.end(); I != E; ++I) {
@@ -284,9 +284,10 @@ void Sema::CheckForwardProtocolDeclarationForCircularDependency(
if (PDecl->getIdentifier() == PName) {
Diag(Ploc, diag::err_protocol_has_circular_dependency);
Diag(PrevLoc, diag::note_previous_definition);
err = true;
}
CheckForwardProtocolDeclarationForCircularDependency(PName, Ploc,
PDecl->getLocation(), PDecl->getReferencedProtocols());
PDecl->getLocation(), PDecl->getReferencedProtocols(), err);
}
}
}
@@ -300,6 +301,7 @@ Sema::ActOnStartProtocolInterface(SourceLocation AtProtoInterfaceLoc,
const SourceLocation *ProtoLocs,
SourceLocation EndProtoLoc,
AttributeList *AttrList) {
bool err = false;
// FIXME: Deal with AttrList.
assert(ProtocolName && "Missing protocol identifier");
ObjCProtocolDecl *PDecl = LookupProtocol(ProtocolName, ProtocolLoc);
@@ -315,7 +317,7 @@ Sema::ActOnStartProtocolInterface(SourceLocation AtProtoInterfaceLoc,
ObjCList<ObjCProtocolDecl> PList;
PList.set((ObjCProtocolDecl *const*)ProtoRefs, NumProtoRefs, Context);
CheckForwardProtocolDeclarationForCircularDependency(
ProtocolName, ProtocolLoc, PDecl->getLocation(), PList);
ProtocolName, ProtocolLoc, PDecl->getLocation(), PList, err);
// Make sure the cached decl gets a valid start location.
PDecl->setLocation(AtProtoInterfaceLoc);
@@ -331,7 +333,7 @@ Sema::ActOnStartProtocolInterface(SourceLocation AtProtoInterfaceLoc,
}
if (AttrList)
ProcessDeclAttributeList(TUScope, PDecl, AttrList);
if (NumProtoRefs) {
if (!err && NumProtoRefs ) {
/// Check then save referenced protocols.
PDecl->setProtocolList((ObjCProtocolDecl**)ProtoRefs, NumProtoRefs,
ProtoLocs, Context);