+ void *operator new(size_t s, unsigned Us);
+ User(const Type *ty, unsigned vty, Use *OpList, unsigned NumOps)
+ : Value(ty, vty), OperandList(OpList), NumOperands(NumOps) {}
+ Use *allocHungoffUses(unsigned) const;
+ void dropHungoffUses(Use *U) {
+ if (OperandList == U) {
+ OperandList = 0;
+ NumOperands = 0;
+ }
+ Use::zap(U, U->getImpliedUser(), true);
+ }
+public:
+ ~User() {
+ Use::zap(OperandList, OperandList + NumOperands);
+ }
+ /// operator delete - free memory allocated for User and Use objects
+ void operator delete(void *Usr);
+ /// placement delete - required by std, but never called.
+ void operator delete(void*, unsigned) {
+ assert(0 && "Constructor throws?");
+ }
+ template <unsigned Idx> Use &Op() {
+ return OperandTraits<User>::op_begin(this)[Idx];
+ }
+ template <unsigned Idx> const Use &Op() const {
+ return OperandTraits<User>::op_begin(const_cast<User*>(this))[Idx];