]> granicus.if.org Git - clang/commitdiff
implement serialization support for @encode,
authorChris Lattner <sabre@nondot.org>
Wed, 22 Apr 2009 05:57:30 +0000 (05:57 +0000)
committerChris Lattner <sabre@nondot.org>
Wed, 22 Apr 2009 05:57:30 +0000 (05:57 +0000)
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

include/clang/AST/ExprObjC.h
include/clang/Frontend/PCHBitCodes.h
lib/Frontend/PCHReader.cpp
lib/Frontend/PCHWriter.cpp
test/PCH/objc_exprs.h [new file with mode: 0644]
test/PCH/objc_exprs.m [new file with mode: 0644]

index 5775cab3ba90eef7964a095eb04397210a1a30d9..2ac20a04de247c5852cff6cfa71fd734bd6a9934 100644 (file)
@@ -65,15 +65,23 @@ public:
                  SourceLocation at, SourceLocation rp)
     : Expr(ObjCEncodeExprClass, T), EncType(ET), AtLoc(at), RParenLoc(rp) {}
   
+  /// \brief Build an empty block expression.
+  explicit ObjCEncodeExpr(EmptyShell Empty) : Expr(ObjCEncodeExprClass, Empty){}
+
+  
   SourceLocation getAtLoc() const { return AtLoc; }
+  void setAtLoc(SourceLocation L) { AtLoc = L; }
   SourceLocation getRParenLoc() const { return RParenLoc; }
+  void setRParenLoc(SourceLocation L) { RParenLoc = L; }
+  
+  QualType getEncodedType() const { return EncType; }
+  void setEncodedType(QualType T) { EncType = T; }
+
   
   virtual SourceRange getSourceRange() const {
     return SourceRange(AtLoc, RParenLoc);
   }
-
-  QualType getEncodedType() const { return EncType; }
-
+  
   static bool classof(const Stmt *T) {
     return T->getStmtClass() == ObjCEncodeExprClass;
   }
index d21e10cd6974a434365111cd3c289606743d39b3..490909056a09e25d559b2da183f85a86c6a3e820 100644 (file)
@@ -520,7 +520,12 @@ namespace clang {
       /// \brief BlockExpr
       EXPR_BLOCK,
       /// \brief A BlockDeclRef record.
-      EXPR_BLOCK_DECL_REF
+      EXPR_BLOCK_DECL_REF,
+      
+      // Objective-C
+      /// \brief A ObjCEncodeExpr record.
+      EXPR_OBJC_ENCODE
+
     };
 
     /// \brief The kinds of designators that can occur in a
index 7018b26c2767e72a4aea4ad971a67e58a5ad8d7b..e3413cbcd1d21366d6afd4e6d5ad5a33308bca16 100644 (file)
@@ -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.
index bdcd3593142e4a644bc585795c247743115ba4ea..a908a8bfeea52f31a058dda86dfc94cc8e78e1a4 100644 (file)
@@ -656,6 +656,11 @@ namespace {
     void VisitShuffleVectorExpr(ShuffleVectorExpr *E);
     void VisitBlockExpr(BlockExpr *E);
     void VisitBlockDeclRefExpr(BlockDeclRefExpr *E);
+      
+    // Objective-C
+    void VisitObjCEncodeExpr(ObjCEncodeExpr *E);
+
+      
   };
 }
 
@@ -1147,6 +1152,19 @@ void PCHStmtWriter::VisitBlockDeclRefExpr(BlockDeclRefExpr *E) {
   Code = pch::EXPR_BLOCK_DECL_REF;
 }
 
+//===----------------------------------------------------------------------===//
+// Objective-C Expressions and Statements.
+//===----------------------------------------------------------------------===//
+
+void PCHStmtWriter::VisitObjCEncodeExpr(ObjCEncodeExpr *E) { 
+  VisitExpr(E);
+  Writer.AddTypeRef(E->getEncodedType(), Record);
+  Writer.AddSourceLocation(E->getAtLoc(), Record);
+  Writer.AddSourceLocation(E->getRParenLoc(), Record);
+  Code = pch::EXPR_OBJC_ENCODE;
+}
+
+
 //===----------------------------------------------------------------------===//
 // PCHWriter Implementation
 //===----------------------------------------------------------------------===//
diff --git a/test/PCH/objc_exprs.h b/test/PCH/objc_exprs.h
new file mode 100644 (file)
index 0000000..136a34c
--- /dev/null
@@ -0,0 +1,5 @@
+
+inline const char *foo() {
+  return @encode(int);
+}
+
diff --git a/test/PCH/objc_exprs.m b/test/PCH/objc_exprs.m
new file mode 100644 (file)
index 0000000..7a37321
--- /dev/null
@@ -0,0 +1,7 @@
+// Test this without pch.
+// RUN: clang-cc -fblocks -include %S/objc_exprs.h -fsyntax-only -verify %s &&
+
+// Test with pch.
+// RUN: clang-cc -x objective-c-header -emit-pch -fblocks -o %t %S/objc_exprs.h &&
+// RUN: clang-cc -fblocks -include-pch %t -fsyntax-only -verify %s 
+