// Copyright (C) 2017-2019 Free Software Foundation, Inc. // // This file is part of the GNU ISO C++ Library. This library is free // software; you can redistribute it and/or modify it under the // terms of the GNU General Public License as published by the // Free Software Foundation; either version 3, or (at your option) // any later version. // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License along // with this library; see the file COPYING3. If not see // . // { dg-do run { target c++11 } } // libstdc++/80893 #include #include struct DereferencedInvalidPointer { }; // User-defined pointer type that throws if a null pointer is dereferenced. template struct Pointer : __gnu_test::PointerBase, T> { using __gnu_test::PointerBase, T>::PointerBase; T& operator*() const { if (!this->value) throw DereferencedInvalidPointer(); return *this->value; } }; // Minimal allocator using Pointer template struct Alloc { typedef T value_type; typedef Pointer pointer; Alloc() = default; template Alloc(const Alloc&) { } pointer allocate(std::size_t n) { if (n) return pointer(std::allocator().allocate(n)); return nullptr; } void deallocate(pointer p, std::size_t n) { if (n) std::allocator().deallocate(p.operator->(), n); } }; template bool operator==(Alloc, Alloc) { return true; } template bool operator!=(Alloc, Alloc) { return false; } int main() { std::vector> v(0); std::vector> w(v); }