namespace std {
  using size_t = decltype(sizeof(0));
  enum class align_val_t : size_t;
  struct destroying_delete_t {
    struct __construct { explicit __construct() = default; };
    explicit destroying_delete_t(__construct) {}
  };
  inline constexpr destroying_delete_t destroying_delete(destroying_delete_t::__construct());
}
void operator delete(void*, std::destroying_delete_t); 
struct A;
void operator delete(A*, std::destroying_delete_t); 
struct A {
  void operator delete(A*, std::destroying_delete_t);
  void operator delete(A*, std::destroying_delete_t, std::size_t);
  void operator delete(A*, std::destroying_delete_t, std::align_val_t);
  void operator delete(A*, std::destroying_delete_t, std::size_t, std::align_val_t);
  void operator delete(A*, std::destroying_delete_t, int);     void operator delete(A*, std::destroying_delete_t, std::size_t, ...);
  void operator delete(struct X*, std::destroying_delete_t, std::size_t, ...); 
  void operator delete(void*, std::size_t);
};
void delete_A(A *a) { delete a; }
namespace convert_param {
  struct A {
    void operator delete(
        A*,
        std::destroying_delete_t);
  };
  struct B : private A { using A::operator delete; };   struct C : B {};
  void delete_C(C *c) { delete c; } 
    struct D : B { virtual ~D() {} }; }
namespace delete_selection {
  struct B {
    void operator delete(void*) = delete;
    void operator delete(B *, std::destroying_delete_t) = delete;   };
  void delete_B(B *b) { delete b; } 
  struct C {
    C();
    void *operator new(std::size_t);
    void operator delete(void*) = delete;     void operator delete(C *, std::destroying_delete_t) = delete;
  };
    #ifdef __EXCEPTIONS
  #endif
  C *new_C() { return new C; }
  struct D {
    void operator delete(D *, std::destroying_delete_t) = delete;     void operator delete(D *, std::destroying_delete_t, std::align_val_t) = delete;
  };
  void delete_D(D *d) { delete d; } 
  struct alignas(__STDCPP_DEFAULT_NEW_ALIGNMENT__ * 2) E {
    void operator delete(E *, std::destroying_delete_t) = delete;
    void operator delete(E *, std::destroying_delete_t, std::align_val_t) = delete;   };
  void delete_E(E *e) { delete e; } 
  struct F {
    void operator delete(F *, std::destroying_delete_t) = delete;     void operator delete(F *, std::destroying_delete_t, std::size_t) = delete;
  };
  void delete_F(F *f) { delete f; } 
  struct G {
    void operator delete(G *, std::destroying_delete_t, std::align_val_t) = delete;
    void operator delete(G *, std::destroying_delete_t, std::size_t) = delete;   };
  void delete_G(G *g) { delete g; } 
  struct H {
    void operator delete(H *, std::destroying_delete_t, std::align_val_t) = delete;     void operator delete(H *, std::destroying_delete_t, std::size_t, std::align_val_t) = delete;
  };
  void delete_H(H *h) { delete h; } 
  struct alignas(__STDCPP_DEFAULT_NEW_ALIGNMENT__ * 2) I {
    void operator delete(I *, std::destroying_delete_t, std::size_t) = delete;
    void operator delete(I *, std::destroying_delete_t, std::size_t, std::align_val_t) = delete;   };
  void delete_I(I *i) { delete i; } }
namespace first_param_conversion {
  struct A {
    void operator delete(A *, std::destroying_delete_t);
  };
  void f(const volatile A *a) {
    delete a;   }
  struct B {
    void operator delete(B *, std::destroying_delete_t);
  };
  struct C : B {};
  struct D : B {};
  struct E : C, D {};
  void g(E *e) {
    delete e;   }
}
namespace templated {
  template<typename T> using id_alias = T;
  template<typename T> struct id_struct { using type = T; };
  template<typename T> struct A {
    void operator delete(A *, std::destroying_delete_t);
  };
  template<typename T> struct B {
    void operator delete(B<T> *, std::destroying_delete_t);
  };
  template<typename T> struct C {
    void operator delete(id_alias<C> *, std::destroying_delete_t);
  };
  template<typename T> struct D {
    void operator delete(typename id_struct<D>::type *, std::destroying_delete_t);   };
}
namespace dtor_access {
  struct S {
    void operator delete(S *p, std::destroying_delete_t);
  private:
    ~S();   };
      void f() { delete new S; } 
  struct T {
    void operator delete(T *, std::destroying_delete_t);
  protected:
    virtual ~T();   };
  struct U : T {
    void operator delete(void *);
  private:
    ~U() override;
  };
  void g() { delete (T *)new U; } }
namespace delete_from_new {
  struct A {
    A();     void operator delete(A *, std::destroying_delete_t) = delete;
  };
  struct B {
    B();     void operator delete(void *) = delete;     void operator delete(B *, std::destroying_delete_t) = delete;
  };
  void f() {
    new A;     new B; #ifdef __EXCEPTIONS
    #endif
  }
}