]> granicus.if.org Git - clang/commitdiff
Serialize the 'IsConstexpr' bit of VarDecls. Fixes <rdar://problem/12328814>.
authorDouglas Gregor <dgregor@apple.com>
Thu, 20 Sep 2012 23:43:29 +0000 (23:43 +0000)
committerDouglas Gregor <dgregor@apple.com>
Thu, 20 Sep 2012 23:43:29 +0000 (23:43 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@164335 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Serialization/ASTReaderDecl.cpp
lib/Serialization/ASTWriterDecl.cpp
test/PCH/cxx11-constexpr.cpp

index 109d378105d7a61c7f3b0937d330455fd54f42ca..754ff36db79bd621a182bc28330e8917b453a7d0 100644 (file)
@@ -898,7 +898,8 @@ void ASTDeclReader::VisitVarDecl(VarDecl *VD) {
   VD->VarDeclBits.NRVOVariable = Record[Idx++];
   VD->VarDeclBits.CXXForRangeDecl = Record[Idx++];
   VD->VarDeclBits.ARCPseudoStrong = Record[Idx++];
-
+  VD->VarDeclBits.IsConstexpr = Record[Idx++];
+  
   // Only true variables (not parameters or implicit parameters) can be merged.
   if (VD->getKind() == Decl::Var)
     mergeRedeclarable(VD, Redecl);
index 76a23321432b3ee6fa1b25fcaf6d808db790eacf..7122bca9699ea5c35c88b08157d711346a96e72e 100644 (file)
@@ -675,6 +675,8 @@ void ASTDeclWriter::VisitVarDecl(VarDecl *D) {
   Record.push_back(D->isNRVOVariable());
   Record.push_back(D->isCXXForRangeDecl());
   Record.push_back(D->isARCPseudoStrong());
+  Record.push_back(D->isConstexpr());
+
   if (D->getInit()) {
     Record.push_back(!D->isInitKnownICE() ? 1 : (D->isInitICE() ? 3 : 2));
     Writer.AddStmt(D->getInit());
@@ -705,6 +707,7 @@ void ASTDeclWriter::VisitVarDecl(VarDecl *D) {
       D->getInitStyle() == VarDecl::CInit &&
       D->getInit() == 0 &&
       !isa<ParmVarDecl>(D) &&
+      !D->isConstexpr() &&
       !SpecInfo)
     AbbrevToUse = Writer.getDeclVarAbbrev();
 
@@ -1478,6 +1481,7 @@ void ASTWriter::WriteDeclsBlockAbbrevs() {
   Abv->Add(BitCodeAbbrevOp(0));                       // isNRVOVariable
   Abv->Add(BitCodeAbbrevOp(0));                       // isCXXForRangeDecl
   Abv->Add(BitCodeAbbrevOp(0));                       // isARCPseudoStrong
+  Abv->Add(BitCodeAbbrevOp(0));                       // isConstexpr
   Abv->Add(BitCodeAbbrevOp(0));                       // HasInit
   Abv->Add(BitCodeAbbrevOp(0));                   // HasMemberSpecializationInfo
   // ParmVarDecl
@@ -1556,6 +1560,7 @@ void ASTWriter::WriteDeclsBlockAbbrevs() {
   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // isNRVOVariable
   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // isCXXForRangeDecl
   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // isARCPseudoStrong
+  Abv->Add(BitCodeAbbrevOp(0));                         // isConstexpr
   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // HasInit
   Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // HasMemberSpecInfo
   // Type Source Info
index ce43206d3960a35b52944b8dbd7404bc6d253191..8b722ce980951fd111e6f1f945f4ea3d4f2bc308 100644 (file)
@@ -20,6 +20,13 @@ struct D : B {
   int k;
 };
 
+constexpr int value = 7;
+
+template<typename T>
+constexpr T plus_seven(T other) {
+  return value + other;
+}
+
 #else
 
 static_assert(D(4).k == 9, "");
@@ -28,4 +35,6 @@ constexpr int f(C c) { return 0; } // expected-error {{not a literal type}}
 constexpr B b; // expected-error {{constant expression}} expected-note {{non-constexpr}}
                // expected-note@9 {{here}}
 
+static_assert(plus_seven(3) == 10, "");
+
 #endif