[PM] Add the explicit copy, move, swap, and assignment boilerplate

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.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@277582 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Chandler Carruth 2016-08-03 08:16:08 +00:00
parent 91b6bfa061
commit 9d383c5b84

View 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;
};