diff --git a/clang/include/clang/AST/DeclObjC.h b/clang/include/clang/AST/DeclObjC.h index 5f6bdec1cff2..9d9b9b1d7d8a 100644 --- a/clang/include/clang/AST/DeclObjC.h +++ b/clang/include/clang/AST/DeclObjC.h @@ -1071,14 +1071,15 @@ class ObjCProtocolDecl : public ObjCContainerDecl, // \brief The declaration that defines this protocol. ObjCProtocolDecl *Definition; - /// Referenced protocols + /// \brief Referenced protocols ObjCProtocolList ReferencedProtocols; + + /// \brief Marks the '>' or identifier. + SourceLocation EndLoc; }; DefinitionData *Data; - SourceLocation EndLoc; // marks the '>' or identifier. - DefinitionData &data() const { assert(Data && "Objective-C protocol has no definition!"); return *Data; @@ -1181,10 +1182,21 @@ public: /// \brief Starts the definition of this Objective-C protocol. void startDefinition(); - // Location information, modeled after the Stmt API. - SourceLocation getLocStart() const { return getAtStartLoc(); } // '@'protocol - SourceLocation getLocEnd() const { return EndLoc; } - void setLocEnd(SourceLocation LE) { EndLoc = LE; } + virtual SourceRange getSourceRange() const { + if (isThisDeclarationADefinition()) + return ObjCContainerDecl::getSourceRange(); + + return SourceRange(getAtStartLoc(), getLocation()); + } + + SourceLocation getEndOfDefinitionLoc() const { + if (!hasDefinition()) + return getLocation(); + + return data().EndLoc; + } + + void setEndOfDefinitionLoc(SourceLocation LE) { data().EndLoc = LE; } typedef redeclarable_base::redecl_iterator redecl_iterator; redecl_iterator redecls_begin() const { diff --git a/clang/lib/Sema/SemaDeclObjC.cpp b/clang/lib/Sema/SemaDeclObjC.cpp index e76971188ff9..9658174f97d1 100644 --- a/clang/lib/Sema/SemaDeclObjC.cpp +++ b/clang/lib/Sema/SemaDeclObjC.cpp @@ -615,7 +615,7 @@ Sema::ActOnStartProtocolInterface(SourceLocation AtProtoInterfaceLoc, /// Check then save referenced protocols. PDecl->setProtocolList((ObjCProtocolDecl**)ProtoRefs, NumProtoRefs, ProtoLocs, Context); - PDecl->setLocEnd(EndProtoLoc); + PDecl->setEndOfDefinitionLoc(EndProtoLoc); } CheckObjCDeclScope(PDecl); diff --git a/clang/lib/Serialization/ASTReaderDecl.cpp b/clang/lib/Serialization/ASTReaderDecl.cpp index 46dcc8757d90..75a2aad5e47c 100644 --- a/clang/lib/Serialization/ASTReaderDecl.cpp +++ b/clang/lib/Serialization/ASTReaderDecl.cpp @@ -764,7 +764,6 @@ void ASTDeclReader::VisitObjCProtocolDecl(ObjCProtocolDecl *PD) { RedeclarableResult Redecl = VisitRedeclarable(PD); VisitObjCContainerDecl(PD); - PD->setLocEnd(ReadSourceLocation(Record, Idx)); // Determine whether we need to merge this declaration with another @protocol // with the same name. @@ -822,6 +821,8 @@ void ASTDeclReader::VisitObjCProtocolDecl(ObjCProtocolDecl *PD) { PD->setProtocolList(ProtoRefs.data(), NumProtoRefs, ProtoLocs.data(), Reader.getContext()); + PD->setEndOfDefinitionLoc(ReadSourceLocation(Record, Idx)); + // Note that we have deserialized a definition. Reader.PendingDefinitions.insert(PD); } else if (Def && Def->Data) { diff --git a/clang/lib/Serialization/ASTWriterDecl.cpp b/clang/lib/Serialization/ASTWriterDecl.cpp index 4701b8fc386a..8510feca5e56 100644 --- a/clang/lib/Serialization/ASTWriterDecl.cpp +++ b/clang/lib/Serialization/ASTWriterDecl.cpp @@ -518,7 +518,6 @@ void ASTDeclWriter::VisitObjCIvarDecl(ObjCIvarDecl *D) { void ASTDeclWriter::VisitObjCProtocolDecl(ObjCProtocolDecl *D) { VisitRedeclarable(D); VisitObjCContainerDecl(D); - Writer.AddSourceLocation(D->getLocEnd(), Record); ObjCProtocolDecl *Def = D->getDefinition(); Writer.AddDeclRef(Def, Record); @@ -532,6 +531,7 @@ void ASTDeclWriter::VisitObjCProtocolDecl(ObjCProtocolDecl *D) { PLEnd = D->protocol_loc_end(); PL != PLEnd; ++PL) Writer.AddSourceLocation(*PL, Record); + Writer.AddSourceLocation(D->getEndOfDefinitionLoc(), Record); } Code = serialization::DECL_OBJC_PROTOCOL;