[llvm-commits] [llvm] r166530 - in /llvm/trunk: include/llvm/Operator.h lib/VMCore/User.cpp
Craig Topper
craig.topper at gmail.com
Tue Oct 23 22:47:18 PDT 2012
I think this broke self hosting. I think its related to templates somehow,
but not sure beyond that.
llvm/include/llvm/Operator.h:231:7: error: non-deleted function
'~GEPOperator' cannot override a deleted function
class GEPOperator
^
llvm/include/llvm/Operator.h:188:7: note: overridden virtual function is
here
class ConcreteOperator : public SuperClass {
On Tue, Oct 23, 2012 at 5:30 PM, Richard Smith
<richard-llvm at metafoo.co.uk>wrote:
> Author: rsmith
> Date: Tue Oct 23 19:30:41 2012
> New Revision: 166530
>
> URL: http://llvm.org/viewvc/llvm-project?rev=166530&view=rev
> Log:
> Fix ODR violations: a virtual function must be defined, even if it's never
> called. Provide an (asserting) definition of Operator's private destructor.
> Remove destructors from all classes derived from Operator. We don't need
> them
> for safety, because their implicit definitions would be ill-formed (they'd
> call
> Operator's private destructor), and we don't need them to avoid emitting
> vtables, because we don't do anything with Operator subclasses which would
> trigger vtable instantiation.
>
> The Operator hierarchy is still a complete disaster with regard to
> undefined
> behavior, but this at least allows LLVM to link when using Clang's
> -fcatch-undefined-behavior with a new vptr-based type checking mechanism.
>
> Modified:
> llvm/trunk/include/llvm/Operator.h
> llvm/trunk/lib/VMCore/User.cpp
>
> Modified: llvm/trunk/include/llvm/Operator.h
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Operator.h?rev=166530&r1=166529&r2=166530&view=diff
>
> ==============================================================================
> --- llvm/trunk/include/llvm/Operator.h (original)
> +++ llvm/trunk/include/llvm/Operator.h Tue Oct 23 19:30:41 2012
> @@ -36,8 +36,10 @@
> 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 @@
> };
>
> private:
> - ~OverflowingBinaryOperator(); // DO NOT IMPLEMENT
> -
> friend class BinaryOperator;
> friend class ConstantExpr;
> void setHasNoUnsignedWrap(bool B) {
> @@ -132,8 +132,6 @@
> };
>
> private:
> - ~PossiblyExactOperator(); // DO NOT IMPLEMENT
> -
> friend class BinaryOperator;
> friend class ConstantExpr;
> void setIsExact(bool B) {
> @@ -168,9 +166,6 @@
> /// 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 @@
> /// opcodes.
> template<typename SuperClass, unsigned Opc>
> class ConcreteOperator : public SuperClass {
> - ~ConcreteOperator(); // DO NOT IMPLEMENT
> public:
> static inline bool classof(const Instruction *I) {
> return I->getOpcode() == Opc;
> @@ -207,45 +201,35 @@
>
> class AddOperator
> : public ConcreteOperator<OverflowingBinaryOperator, Instruction::Add> {
> - ~AddOperator(); // DO NOT IMPLEMENT
> };
> class SubOperator
> : public ConcreteOperator<OverflowingBinaryOperator, Instruction::Sub> {
> - ~SubOperator(); // DO NOT IMPLEMENT
> };
> class MulOperator
> : public ConcreteOperator<OverflowingBinaryOperator, Instruction::Mul> {
> - ~MulOperator(); // DO NOT IMPLEMENT
> };
> class ShlOperator
> : public ConcreteOperator<OverflowingBinaryOperator, Instruction::Shl> {
> - ~ShlOperator(); // DO NOT IMPLEMENT
> };
>
>
> class SDivOperator
> : public ConcreteOperator<PossiblyExactOperator, Instruction::SDiv> {
> - ~SDivOperator(); // DO NOT IMPLEMENT
> };
> class UDivOperator
> : public ConcreteOperator<PossiblyExactOperator, Instruction::UDiv> {
> - ~UDivOperator(); // DO NOT IMPLEMENT
> };
> class AShrOperator
> : public ConcreteOperator<PossiblyExactOperator, Instruction::AShr> {
> - ~AShrOperator(); // DO NOT IMPLEMENT
> };
> class LShrOperator
> : public ConcreteOperator<PossiblyExactOperator, Instruction::LShr> {
> - ~LShrOperator(); // DO NOT IMPLEMENT
> };
>
>
>
> class GEPOperator
> : public ConcreteOperator<Operator, Instruction::GetElementPtr> {
> - ~GEPOperator(); // DO NOT IMPLEMENT
> -
> enum {
> IsInBounds = (1 << 0)
> };
>
> Modified: llvm/trunk/lib/VMCore/User.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/VMCore/User.cpp?rev=166530&r1=166529&r2=166530&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/VMCore/User.cpp (original)
> +++ llvm/trunk/lib/VMCore/User.cpp Tue Oct 23 19:30:41 2012
> @@ -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 @@
> ::operator delete(Storage);
> }
>
>
> +//===----------------------------------------------------------------------===//
> +// Operator Class
>
> +//===----------------------------------------------------------------------===//
> +
> +Operator::~Operator() {
> + llvm_unreachable("should never destroy an Operator");
> +}
> +
> } // End llvm namespace
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>
--
~Craig
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20121023/90d266e3/attachment.html>
More information about the llvm-commits
mailing list