[PM] Add the explicit copy, move, swap, and assignment boilerplate
authorChandler Carruth <chandlerc@gmail.com>
Wed, 3 Aug 2016 08:16:08 +0000 (08:16 +0000)
committerChandler Carruth <chandlerc@gmail.com>
Wed, 3 Aug 2016 08:16:08 +0000 (08:16 +0000)
required by MSVC 2013.

This also makes the repeating pass wrapper assignable. Mildly
unfortunate as it means we can't use a const member for the int, but
that is a really minor invariant to try to preserve at the cost of loss
of regularity of the type. Yet another annoyance of the particular C++
object / move semantic model.

llvm-svn: 277582

llvm/include/llvm/IR/PassManager.h

index 7a63640..47573da 100644 (file)
@@ -995,6 +995,21 @@ template <typename PassT>
 class RepeatingPassWrapper : public PassInfoMixin<RepeatingPassWrapper<PassT>> {
 public:
   RepeatingPassWrapper(int Count, PassT P) : Count(Count), P(std::move(P)) {}
+  // We have to explicitly define all the special member functions because MSVC
+  // refuses to generate them.
+  RepeatingPassWrapper(const RepeatingPassWrapper &Arg)
+      : Count(Arg.Count), P(Arg.P) {}
+  RepeatingPassWrapper(RepeatingPassWrapper &&Arg)
+      : Count(Arg.Count), P(std::move(Arg.P)) {}
+  friend void swap(RepeatingPassWrapper &LHS, RepeatingPassWrapper &RHS) {
+    using std::swap;
+    swap(LHS.Count, RHS.Count);
+    swap(LHS.P, RHS.P);
+  }
+  RepeatingPassWrapper &operator=(RepeatingPassWrapper RHS) {
+    swap(*this, RHS);
+    return *this;
+  }
 
   template <typename IRUnitT, typename... Ts>
   PreservedAnalyses run(IRUnitT &Arg, AnalysisManager<IRUnitT> &AM,
@@ -1006,7 +1021,7 @@ public:
   }
 
 private:
-  const int Count;
+  int Count;
   PassT P;
 };