From: Argyrios Kyrtzidis Date: Thu, 22 Jul 2010 17:28:12 +0000 (+0000) Subject: Read/write C++0x static_assert for PCH. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=0d396896998685809bda7444d772bbeb5bbe9b46;p=clang 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 --- 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(Reader.ReadExpr()); } std::pair @@ -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 struct T { + static_assert(N == 2, "N is not 2!"); +};