1// -*- C++ -*- 2 3// Copyright (C) 2013-2015 Free Software Foundation, Inc. 4// 5// This file is part of the GNU ISO C++ Library. This library is free 6// software; you can redistribute it and/or modify it under the 7// terms of the GNU General Public License as published by the 8// Free Software Foundation; either version 3, or (at your option) 9// any later version. 10 11// This library is distributed in the hope that it will be useful, 12// but WITHOUT ANY WARRANTY; without even the implied warranty of 13// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14// GNU General Public License for more details. 15 16// You should have received a copy of the GNU General Public License along 17// with this library; see the file COPYING3. If not see 18// <http://www.gnu.org/licenses/>. 19 20#include <testsuite_hooks.h> 21#include <map> 22 23// { dg-do compile } 24// { dg-options "-std=gnu++11" } 25 26// libstdc++/56613 27 28// A conforming C++03 allocator, should still work in C++11 mode. 29template<typename T> 30struct alloc 31{ 32 typedef T value_type; 33 typedef T* pointer; 34 typedef const T* const_pointer; 35 typedef T& reference; 36 typedef const T& const_reference; 37 typedef unsigned size_type; 38 typedef int difference_type; 39 40 template<typename U> 41 struct rebind { 42 typedef alloc<U> other; 43 }; 44 45 alloc() { } 46 template<typename U> 47 alloc(const alloc<U>&) { } 48 49 pointer allocate(size_type n, const void* = 0) { return 50std::allocator<T>().allocate(n); } 51 void deallocate(pointer p, size_type n) { std::allocator<T>().deallocate(p, 52n); } 53 54 size_type max_size() const { return -1; } 55 56 void construct(pointer p, const T& t) { new ((void*) p) T(t); } 57 void destroy(pointer p) { p->~T(); } 58 59 pointer address(reference x) const throw() { return &x; } 60 const_pointer address(const_reference x) const throw() { return &x; } 61}; 62 63template<typename T, typename U> 64bool operator==(alloc<T>, alloc<U>) { return true; } 65 66template<typename T, typename U> 67bool operator!=(alloc<T>, alloc<U>) { return false; } 68 69int main() 70{ 71 std::map<int, int, std::less<int>, alloc<int> > m; 72 m[1]; 73} 74