[llvm] r340700 - Avoid specializing a variadic member template in a way that seems to not

Chandler Carruth via llvm-commits llvm-commits at lists.llvm.org
Sun Aug 26 02:17:49 PDT 2018


Author: chandlerc
Date: Sun Aug 26 02:17:49 2018
New Revision: 340700

URL: http://llvm.org/viewvc/llvm-project?rev=340700&view=rev
Log:
Avoid specializing a variadic member template in a way that seems to not
agree with MSVC.

There isn't actually a need for specialization here as we can write the
code generically and just have a test that will fold away as a constant.

Modified:
    llvm/trunk/lib/Support/ItaniumManglingCanonicalizer.cpp

Modified: llvm/trunk/lib/Support/ItaniumManglingCanonicalizer.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/ItaniumManglingCanonicalizer.cpp?rev=340700&r1=340699&r2=340700&view=diff
==============================================================================
--- llvm/trunk/lib/Support/ItaniumManglingCanonicalizer.cpp (original)
+++ llvm/trunk/lib/Support/ItaniumManglingCanonicalizer.cpp Sun Aug 26 02:17:49 2018
@@ -104,8 +104,19 @@ class FoldingNodeAllocator {
 public:
   void reset() {}
 
-  template<typename T, typename ...Args>
-  std::pair<Node*, bool> getOrCreateNode(bool CreateNewNodes, Args &&...As) {
+  template <typename T, typename... Args>
+  std::pair<Node *, bool> getOrCreateNode(bool CreateNewNodes, Args &&... As) {
+    // FIXME: Don't canonicalize forward template references for now, because
+    // they contain state (the resolved template node) that's not known at their
+    // point of creation.
+    if (std::is_same<T, ForwardTemplateReference>::value) {
+      // Note that we don't use if-constexpr here and so we must still write
+      // this code in a generic form.
+      return {new (RawAlloc.Allocate(sizeof(T), alignof(T)))
+                  T(std::forward<Args>(As)...),
+              true};
+    }
+
     llvm::FoldingSetNodeID ID;
     profileCtor(ID, NodeKind<T>::Kind, As...);
 
@@ -136,19 +147,6 @@ public:
   }
 };
 
-// FIXME: Don't canonicalize forward template references for now, because they
-// contain state (the resolved template node) that's not known at their point
-// of creation.
-template<>
-std::pair<Node *, bool>
-FoldingNodeAllocator::getOrCreateNode<ForwardTemplateReference>(bool,
-                                                                size_t &Index) {
-  return {new (RawAlloc.Allocate(sizeof(ForwardTemplateReference),
-                                 alignof(ForwardTemplateReference)))
-              ForwardTemplateReference(Index),
-          true};
-}
-
 class CanonicalizerAllocator : public FoldingNodeAllocator {
   Node *MostRecentlyCreated = nullptr;
   Node *TrackedNode = nullptr;




More information about the llvm-commits mailing list