rsmith added inline comments.

================
Comment at: lib/Serialization/ASTReaderDecl.cpp:213-215
+      assert(isa<RedeclarableTemplateDecl>(D) ||
+             isa<TypeAliasTemplateDecl>(D) &&
+             "Decl doesn't have specializations.");
----------------
Can this ever fail at runtime? I'd expect the below code to not compile if `D` 
isn't one of these types.


================
Comment at: lib/Serialization/ASTReaderDecl.cpp:3911-3924
+    case UPD_CXX_ADDED_TEMPLATE_SPECIALIZATION: {
+      // It will be added to the template's lazy specialization set when 
loaded.
+      SmallVector<serialization::DeclID, 1> SpecID;
+      SpecID.push_back(ReadDeclID());
+      if (auto *CTD = dyn_cast<ClassTemplateDecl>(D))
+        AddLazySpecializations(CTD, SpecID);
+      else if (auto *FTD = dyn_cast<FunctionTemplateDecl>(D))
----------------
This will end up being quadratic time and using quadratic storage if a module 
adds N specializations to a template; instead, please move the SmallVector out 
of the loop and call `AddLazySpecializations` once after reading all the update 
records for the declaration. (It's probably best to move it all the way out to 
`loadDeclUpdateRecords`, in case we have a large number of modules each adding 
some specializations -- eg, if module A imports std::vector and declares A, 
module B declares B and uses vector<A>, module C declares C and uses vector<B>, 
..., we again should avoid quadratic behavior.)


https://reviews.llvm.org/D29951



_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to