1// { dg-options "-std=gnu++11" } 2 3// Copyright (C) 2011-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 <memory> 21#include <new> 22#include <testsuite_hooks.h> 23 24struct X 25{ 26 static int counter; 27 ~X() { ++counter; } 28}; 29 30int X::counter = 0; 31 32template<typename T> 33struct allocator_with_destroy 34{ 35 typedef T value_type; 36 37 allocator_with_destroy() : called() { } 38 39 void destroy(T* p) { called = true; } 40 41 int called; 42}; 43 44template<typename T> 45struct allocator_without_destroy 46{ 47 typedef T value_type; 48 49 allocator_without_destroy() : called() { } 50 51 int called; 52}; 53 54void test01() 55{ 56 bool test __attribute__((unused)) = true; 57 58 typedef std::allocator_traits<allocator_with_destroy<X>> traits_type; 59 traits_type::allocator_type a; 60 X* p = 0; 61 traits_type::destroy(a, p); 62 VERIFY( a.called ); 63 VERIFY( X::counter == 0 ); 64} 65 66void test02() 67{ 68 bool test __attribute__((unused)) = true; 69 70 typedef std::allocator_traits<allocator_without_destroy<X>> traits_type; 71 traits_type::allocator_type a; 72 char buf[sizeof(X)]; 73 X* p = ::new (static_cast<void*>(buf)) X(); 74 traits_type::destroy(a, p); 75 VERIFY( !a.called ); 76 VERIFY( X::counter == 1 ); 77} 78 79int main() 80{ 81 test01(); 82 test02(); 83} 84