]> granicus.if.org Git - clang/commitdiff
AST reader support for having specializations of templates from earlier in the chain.
authorSebastian Redl <sebastian.redl@getdesigned.at>
Tue, 24 Aug 2010 22:50:19 +0000 (22:50 +0000)
committerSebastian Redl <sebastian.redl@getdesigned.at>
Tue, 24 Aug 2010 22:50:19 +0000 (22:50 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@111985 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/Serialization/ASTBitCodes.h
include/clang/Serialization/ASTReader.h
lib/Serialization/ASTReader.cpp
lib/Serialization/ASTReaderDecl.cpp

index 3341679965cc5ee835ea64e93f504a25eaa1bd4d..d879fdf402024205cb0f2ad2755e94251ed646b2 100644 (file)
@@ -316,7 +316,11 @@ namespace clang {
       /// \brief Record code for an update to a decl context's lookup table.
       ///
       /// In practice, this should only be used for the TU and namespaces.
-      UPDATE_VISIBLE = 34
+      UPDATE_VISIBLE = 34,
+
+      /// \brief Record code for template specializations introduced after
+      /// serializations of the original template decl.
+      ADDITIONAL_TEMPLATE_SPECIALIZATIONS = 35
     };
 
     /// \brief Record types used within a source manager block.
index 889605e34d38d97155a8c5c6182d3bb508b50add..12fb3163f88bf09d6b690a974bb4f995ba60c4e3 100644 (file)
@@ -372,6 +372,16 @@ private:
   /// most recent declarations in another AST file.
   FirstLatestDeclIDMap FirstLatestDeclIDs;
 
+  typedef llvm::SmallVector<serialization::DeclID, 4>
+      AdditionalTemplateSpecializations;
+  typedef llvm::DenseMap<serialization::DeclID,
+                         AdditionalTemplateSpecializations>
+      AdditionalTemplateSpecializationsMap;
+
+  /// \brief Additional specializations (including partial) of templates that
+  /// were introduced after the template was serialized.
+  AdditionalTemplateSpecializationsMap AdditionalTemplateSpecializationsPending;
+
   /// \brief Read the records that describe the contents of declcontexts.
   bool ReadDeclContextStorage(llvm::BitstreamCursor &Cursor,
                               const std::pair<uint64_t, uint64_t> &Offsets,
index 46448fff0c9d56c6dc3b2fbdf190ed5f6e7b626b..9acc759fc945ee761db8ff902304642f91bc1143 100644 (file)
@@ -1972,6 +1972,13 @@ ASTReader::ReadASTBlock(PerFileData &F) {
             std::make_pair(&F, Record[I+1]);
       break;
     }
+
+    case ADDITIONAL_TEMPLATE_SPECIALIZATIONS: {
+      AdditionalTemplateSpecializations &ATS =
+          AdditionalTemplateSpecializationsPending[Record[0]];
+      ATS.insert(ATS.end(), Record.begin()+1, Record.end());
+      break;
+    }
     }
     First = false;
   }
index d2fb408e56c9810390e39556c06d6f6985be37bd..d5649ad7be017fa92686204d6ab39b60944475e1 100644 (file)
@@ -1424,6 +1424,20 @@ Decl *ASTReader::ReadDeclRecord(unsigned Index, DeclID ID) {
       }
     }
   }
+
+  // If this is a template, read additional specializations that may be in a
+  // different part of the chain.
+  if (isa<RedeclarableTemplateDecl>(D)) {
+    AdditionalTemplateSpecializationsMap::iterator F =
+        AdditionalTemplateSpecializationsPending.find(ID);
+    if (F != AdditionalTemplateSpecializationsPending.end()) {
+      for (AdditionalTemplateSpecializations::iterator I = F->second.begin(),
+                                                       E = F->second.end();
+           I != E; ++I)
+        GetDecl(*I);
+      AdditionalTemplateSpecializationsPending.erase(F);
+    }
+  }
   assert(Idx == Record.size());
 
   // If we have deserialized a declaration that has a definition the