// Copyright (C) 2014-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++/59829 #include #include // 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 "Dereferenced invalid pointer"; 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) { return pointer(std::allocator().allocate(n)); } void deallocate(pointer p, std::size_t n) { std::allocator().deallocate(p.value, n); } }; template bool operator==(Alloc l, Alloc r) { return true; } template bool operator!=(Alloc l, Alloc r) { return false; } int main() { std::vector> a; a.data(); }