https://gcc.gnu.org/bugzilla/show_bug.cgi?id=108619

Jonathan Wakely <redi at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
           Assignee|unassigned at gcc dot gnu.org      |redi at gcc dot gnu.org

--- Comment #12 from Jonathan Wakely <redi at gcc dot gnu.org> ---
This fails for all modes from C++11 to C++20:

#include <memory>
#include <vector>
#include <type_traits>

class a {

  ~a() = default;

  friend class b;

};

class b {

  template<typename C>
    struct alloc {
      std::allocator<C> a;

      alloc() { }

      template<typename U> alloc(const alloc<U>&) { }

      using value_type = C;

      C* allocate(std::size_t n) { return a.allocate(n); }
      void deallocate(C* p, std::size_t n) { return a.deallocate(p, n); }

      template<typename U>
        void destroy(U* p){
          if constexpr (std::is_array_v<U>){
            for(auto& elem : *p){
              (destroy)(std::addressof(elem));
            }
          } else {
            p->~U();
          }
        }

    };

  std::vector<a,alloc<a>> v;

public:

  void f(){
    v.emplace_back();
  }

};


I have a patch ...

Reply via email to