diff options
author | Chris Lattner <sabre@nondot.org> | 2009-04-22 05:57:30 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2009-04-22 05:57:30 +0000 |
commit | 4dcf151a555ff51e4d643e8e6eeb80f121d11d1b (patch) | |
tree | 5b7cc3c33cb3fdce8fb92e04540fdf5cb7033cf4 /lib/Frontend/PCHReader.cpp | |
parent | f7830b6a9edfdccf517b3bd17932686afff0ebf9 (diff) |
implement serialization support for @encode,
fix a couple of bugs in reader support for ObjCInterfaceDecl,
and add support for reading ObjCInterfaceType.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@69779 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Frontend/PCHReader.cpp')
-rw-r--r-- | lib/Frontend/PCHReader.cpp | 24 |
1 files changed, 20 insertions, 4 deletions
diff --git a/lib/Frontend/PCHReader.cpp b/lib/Frontend/PCHReader.cpp index 7018b26c27..e3413cbcd1 100644 --- a/lib/Frontend/PCHReader.cpp +++ b/lib/Frontend/PCHReader.cpp @@ -225,7 +225,8 @@ void PCHDeclReader::VisitObjCContainerDecl(ObjCContainerDecl *CD) { void PCHDeclReader::VisitObjCInterfaceDecl(ObjCInterfaceDecl *ID) { VisitObjCContainerDecl(ID); ID->setTypeForDecl(Reader.GetType(Record[Idx++]).getTypePtr()); - ID->setSuperClass(cast<ObjCInterfaceDecl>(Reader.GetDecl(Record[Idx++]))); + ID->setSuperClass(cast_or_null<ObjCInterfaceDecl> + (Reader.GetDecl(Record[Idx++]))); unsigned NumIvars = Record[Idx++]; llvm::SmallVector<ObjCIvarDecl *, 16> IVars; IVars.reserve(NumIvars); @@ -237,6 +238,7 @@ void PCHDeclReader::VisitObjCInterfaceDecl(ObjCInterfaceDecl *ID) { ID->setImplicitInterfaceDecl(Record[Idx++]); ID->setClassLoc(SourceLocation::getFromRawEncoding(Record[Idx++])); ID->setSuperClassLoc(SourceLocation::getFromRawEncoding(Record[Idx++])); + ID->setAtEndLoc(SourceLocation::getFromRawEncoding(Record[Idx++])); // FIXME: add protocols, categories. } @@ -464,6 +466,7 @@ namespace { unsigned VisitShuffleVectorExpr(ShuffleVectorExpr *E); unsigned VisitBlockExpr(BlockExpr *E); unsigned VisitBlockDeclRefExpr(BlockDeclRefExpr *E); + unsigned VisitObjCEncodeExpr(ObjCEncodeExpr *E); }; } @@ -1013,6 +1016,15 @@ unsigned PCHStmtReader::VisitBlockDeclRefExpr(BlockDeclRefExpr *E) { return 0; } +unsigned PCHStmtReader::VisitObjCEncodeExpr(ObjCEncodeExpr *E) { + VisitExpr(E); + E->setEncodedType(Reader.GetType(Record[Idx++])); + E->setAtLoc(SourceLocation::getFromRawEncoding(Record[Idx++])); + E->setRParenLoc(SourceLocation::getFromRawEncoding(Record[Idx++])); + return 0; +} + + //===----------------------------------------------------------------------===// // PCH reader implementation //===----------------------------------------------------------------------===// @@ -2040,9 +2052,9 @@ QualType PCHReader::ReadTypeRecord(uint64_t Offset) { return Context.getTypeDeclType(cast<EnumDecl>(GetDecl(Record[0]))); case pch::TYPE_OBJC_INTERFACE: - // FIXME: Deserialize ObjCInterfaceType - assert(false && "Cannot de-serialize ObjC interface types yet"); - return QualType(); + assert(Record.size() == 1 && "Incorrect encoding of objc interface type"); + return Context.getObjCInterfaceType( + cast<ObjCInterfaceDecl>(GetDecl(Record[0]))); case pch::TYPE_OBJC_QUALIFIED_INTERFACE: // FIXME: Deserialize ObjCQualifiedInterfaceType @@ -2933,6 +2945,10 @@ Stmt *PCHReader::ReadStmt() { case pch::EXPR_BLOCK_DECL_REF: S = new (Context) BlockDeclRefExpr(Empty); break; + + case pch::EXPR_OBJC_ENCODE: + S = new (Context) ObjCEncodeExpr(Empty); + break; } // We hit a STMT_STOP, so we're done with this expression. |