[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