diff options
author | Argyrios Kyrtzidis <akyrtzi@gmail.com> | 2010-07-22 17:28:12 +0000 |
---|---|---|
committer | Argyrios Kyrtzidis <akyrtzi@gmail.com> | 2010-07-22 17:28:12 +0000 |
commit | 0d396896998685809bda7444d772bbeb5bbe9b46 (patch) | |
tree | 73206124ba5a62a38e6b465f67635cf77d22df34 | |
parent | 0fa7d0b15ea2a224bfe43ac745d411f915da87dd (diff) |
Read/write C++0x static_assert for PCH.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@109123 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | include/clang/AST/DeclCXX.h | 2 | ||||
-rw-r--r-- | lib/Frontend/PCHReaderDecl.cpp | 6 | ||||
-rw-r--r-- | lib/Frontend/PCHWriterDecl.cpp | 5 | ||||
-rw-r--r-- | test/PCH/cxx-static_assert.cpp | 11 | ||||
-rw-r--r-- | test/PCH/cxx-static_assert.h | 9 |
5 files changed, 30 insertions, 3 deletions
diff --git a/include/clang/AST/DeclCXX.h b/include/clang/AST/DeclCXX.h index 41474ab21e..9cea17e8ac 100644 --- a/include/clang/AST/DeclCXX.h +++ b/include/clang/AST/DeclCXX.h @@ -2249,6 +2249,8 @@ public: static bool classof(const Decl *D) { return classofKind(D->getKind()); } static bool classof(StaticAssertDecl *D) { return true; } static bool classofKind(Kind K) { return K == StaticAssert; } + + friend class PCHDeclReader; }; /// Insertion operator for diagnostics. This allows sending AccessSpecifier's diff --git a/lib/Frontend/PCHReaderDecl.cpp b/lib/Frontend/PCHReaderDecl.cpp index 7297fefcb2..d1f8b3aae9 100644 --- a/lib/Frontend/PCHReaderDecl.cpp +++ b/lib/Frontend/PCHReaderDecl.cpp @@ -1035,7 +1035,9 @@ void PCHDeclReader::VisitTemplateTemplateParmDecl(TemplateTemplateParmDecl *D) { } void PCHDeclReader::VisitStaticAssertDecl(StaticAssertDecl *D) { - assert(false && "cannot read StaticAssertDecl"); + VisitDecl(D); + D->AssertExpr = Reader.ReadExpr(); + D->Message = cast<StringLiteral>(Reader.ReadExpr()); } std::pair<uint64_t, uint64_t> @@ -1412,7 +1414,7 @@ Decl *PCHReader::ReadDeclRecord(unsigned Index) { D = TemplateTemplateParmDecl::Create(*Context, 0, SourceLocation(),0,0,0,0); break; case pch::DECL_STATIC_ASSERT: - assert(false && "cannot read StaticAssertDecl"); + D = StaticAssertDecl::Create(*Context, 0, SourceLocation(), 0, 0); break; case pch::DECL_OBJC_METHOD: diff --git a/lib/Frontend/PCHWriterDecl.cpp b/lib/Frontend/PCHWriterDecl.cpp index 122bd3dea1..f6c6cde157 100644 --- a/lib/Frontend/PCHWriterDecl.cpp +++ b/lib/Frontend/PCHWriterDecl.cpp @@ -989,7 +989,10 @@ void PCHDeclWriter::VisitTemplateTemplateParmDecl(TemplateTemplateParmDecl *D) { } void PCHDeclWriter::VisitStaticAssertDecl(StaticAssertDecl *D) { - assert(false && "cannot write StaticAssertDecl"); + VisitDecl(D); + Writer.AddStmt(D->getAssertExpr()); + Writer.AddStmt(D->getMessage()); + Code = pch::DECL_STATIC_ASSERT; } /// \brief Emit the DeclContext part of a declaration context decl. diff --git a/test/PCH/cxx-static_assert.cpp b/test/PCH/cxx-static_assert.cpp new file mode 100644 index 0000000000..34409218ec --- /dev/null +++ b/test/PCH/cxx-static_assert.cpp @@ -0,0 +1,11 @@ +// Test this without pch. +// RUN: %clang_cc1 -include %S/cxx-static_assert.h -verify -std=c++0x %s + +// Test with pch. +// RUN: %clang_cc1 -x c++-header -std=c++0x -emit-pch -o %t %S/cxx-static_assert.h +// RUN: %clang_cc1 -include-pch %t -verify -std=c++0x %s + +// expected-error {{static_assert failed "N is not 2!"}} + +T<1> t1; // expected-note {{in instantiation of template class 'T<1>' requested here}} +T<2> t2; diff --git a/test/PCH/cxx-static_assert.h b/test/PCH/cxx-static_assert.h new file mode 100644 index 0000000000..ba41ab8fed --- /dev/null +++ b/test/PCH/cxx-static_assert.h @@ -0,0 +1,9 @@ +// Header for PCH test cxx-static_assert.cpp + + + + + +template<int N> struct T { + static_assert(N == 2, "N is not 2!"); +}; |