[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