]> granicus.if.org Git - clang/commitdiff
Implement PCH support for offsetof(base-specifier).
authorArgyrios Kyrtzidis <akyrtzi@gmail.com>
Thu, 29 Jul 2010 18:16:10 +0000 (18:16 +0000)
committerArgyrios Kyrtzidis <akyrtzi@gmail.com>
Thu, 29 Jul 2010 18:16:10 +0000 (18:16 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@109785 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Frontend/PCHReaderStmt.cpp
lib/Frontend/PCHWriterStmt.cpp
test/PCH/cxx-offsetof-base.cpp [new file with mode: 0644]
test/PCH/cxx-offsetof-base.h [new file with mode: 0644]

index 86dfd879ca6d461c4941bae3c95b05aee90c385f..6a11529b02c26f35f4505f322c50396b195e10d7 100644 (file)
@@ -502,11 +502,13 @@ void PCHStmtReader::VisitOffsetOfExpr(OffsetOfExpr *E) {
       E->setComponent(I, Node(Start, Reader.GetIdentifier(Record[Idx++]), End));
       break;
         
-    case Node::Base:
-      // FIXME: Implement this!
-      llvm_unreachable("PCH for offsetof(base-specifier) not implemented");
+    case Node::Base: {
+      CXXBaseSpecifier *Base = new (*Reader.getContext()) CXXBaseSpecifier();
+      *Base = Reader.ReadCXXBaseSpecifier(DeclsCursor, Record, Idx);
+      E->setComponent(I, Node(Base));
       break;
     }
+    }
   }
   
   for (unsigned I = 0, N = E->getNumExpressions(); I != N; ++I)
index e807ddff098f121253db16212f93e0b8d58da321..eee409b047dea48ab4aa447bbe70c58ee9d78ad8 100644 (file)
@@ -483,8 +483,7 @@ void PCHStmtWriter::VisitOffsetOfExpr(OffsetOfExpr *E) {
       break;
         
     case OffsetOfExpr::OffsetOfNode::Base:
-      // FIXME: Implement this!
-      llvm_unreachable("PCH for offsetof(base-specifier) not implemented");
+      Writer.AddCXXBaseSpecifier(*ON.getBase(), Record);
       break;
     }
   }
diff --git a/test/PCH/cxx-offsetof-base.cpp b/test/PCH/cxx-offsetof-base.cpp
new file mode 100644 (file)
index 0000000..18265de
--- /dev/null
@@ -0,0 +1,2 @@
+// RUN: %clang_cc1 -x c++-header -emit-pch -o %t %S/cxx-offsetof-base.h
+// RUN: %clang_cc1 -include-pch %t -fsyntax-only %s 
diff --git a/test/PCH/cxx-offsetof-base.h b/test/PCH/cxx-offsetof-base.h
new file mode 100644 (file)
index 0000000..7c78101
--- /dev/null
@@ -0,0 +1,5 @@
+// Header for PCH test cxx-offsetof-base.cpp
+
+struct Base { int x; };
+struct Derived : Base { int y; };
+int o = __builtin_offsetof(Derived, x);