[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.

llvm-svn: 277582
This commit is contained in:
Chandler Carruth 2016-08-03 08:16:08 +00:00
parent 241bf2456f
commit 1af98245f4
1 changed files with 16 additions and 1 deletions

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