diff --git a/include/llvm/Operator.h b/include/llvm/Operator.h index 462324a6694..41e6db0b961 100644 --- a/include/llvm/Operator.h +++ b/include/llvm/Operator.h @@ -36,8 +36,10 @@ private: void *operator new(size_t, unsigned) LLVM_DELETED_FUNCTION; void *operator new(size_t s) LLVM_DELETED_FUNCTION; Operator() LLVM_DELETED_FUNCTION; - // NOTE: cannot use LLVM_DELETED_FUNCTION because it's not legal to delete - // an overridden method that's not deleted in the base class. + + // NOTE: Cannot use LLVM_DELETED_FUNCTION because it's not legal to delete + // an overridden method that's not deleted in the base class. Cannot leave + // this unimplemented because that leads to an ODR-violation. ~Operator(); public: @@ -79,8 +81,6 @@ public: }; private: - ~OverflowingBinaryOperator(); // DO NOT IMPLEMENT - friend class BinaryOperator; friend class ConstantExpr; void setHasNoUnsignedWrap(bool B) { @@ -132,8 +132,6 @@ public: }; private: - ~PossiblyExactOperator(); // DO NOT IMPLEMENT - friend class BinaryOperator; friend class ConstantExpr; void setIsExact(bool B) { @@ -168,9 +166,6 @@ public: /// FPMathOperator - Utility class for floating point operations which can have /// information about relaxed accuracy requirements attached to them. class FPMathOperator : public Operator { -private: - ~FPMathOperator(); // DO NOT IMPLEMENT - public: /// \brief Get the maximum error permitted by this operation in ULPs. An @@ -191,7 +186,6 @@ public: /// opcodes. template class ConcreteOperator : public SuperClass { - ~ConcreteOperator(); // DO NOT IMPLEMENT public: static inline bool classof(const Instruction *I) { return I->getOpcode() == Opc; @@ -207,45 +201,35 @@ public: class AddOperator : public ConcreteOperator { - ~AddOperator(); // DO NOT IMPLEMENT }; class SubOperator : public ConcreteOperator { - ~SubOperator(); // DO NOT IMPLEMENT }; class MulOperator : public ConcreteOperator { - ~MulOperator(); // DO NOT IMPLEMENT }; class ShlOperator : public ConcreteOperator { - ~ShlOperator(); // DO NOT IMPLEMENT }; class SDivOperator : public ConcreteOperator { - ~SDivOperator(); // DO NOT IMPLEMENT }; class UDivOperator : public ConcreteOperator { - ~UDivOperator(); // DO NOT IMPLEMENT }; class AShrOperator : public ConcreteOperator { - ~AShrOperator(); // DO NOT IMPLEMENT }; class LShrOperator : public ConcreteOperator { - ~LShrOperator(); // DO NOT IMPLEMENT }; class GEPOperator : public ConcreteOperator { - ~GEPOperator(); // DO NOT IMPLEMENT - enum { IsInBounds = (1 << 0) }; diff --git a/lib/VMCore/User.cpp b/lib/VMCore/User.cpp index 5f35ce4b9a4..e847ce6ee5c 100644 --- a/lib/VMCore/User.cpp +++ b/lib/VMCore/User.cpp @@ -10,6 +10,7 @@ #include "llvm/Constant.h" #include "llvm/GlobalValue.h" #include "llvm/User.h" +#include "llvm/Operator.h" namespace llvm { @@ -78,4 +79,12 @@ void User::operator delete(void *Usr) { ::operator delete(Storage); } +//===----------------------------------------------------------------------===// +// Operator Class +//===----------------------------------------------------------------------===// + +Operator::~Operator() { + llvm_unreachable("should never destroy an Operator"); +} + } // End llvm namespace