1// Copyright (C) 2014-2015 Free Software Foundation, Inc. 2// 3// This file is part of the GNU ISO C++ Library. This library is free 4// software; you can redistribute it and/or modify it under the 5// terms of the GNU General Public License as published by the 6// Free Software Foundation; either version 3, or (at your option) 7// any later version. 8 9// This library is distributed in the hope that it will be useful, 10// but WITHOUT ANY WARRANTY; without even the implied warranty of 11// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12// GNU General Public License for more details. 13 14// You should have received a copy of the GNU General Public License along 15// with this library; see the file COPYING3. If not see 16// <http://www.gnu.org/licenses/>. 17 18// { dg-do compile } 19// { dg-options "-std=gnu++11" } 20 21#include <deque> 22#include <testsuite_allocator.h> 23 24struct T { int i; }; 25 26namespace __gnu_test 27{ 28 template<typename U> 29 inline void 30 swap(propagating_allocator<U, true>& l, propagating_allocator<U, true>& r) 31 noexcept(false) 32 { } 33} 34 35using __gnu_test::propagating_allocator; 36 37void test01() 38{ 39 typedef std::allocator<T> alloc_type; 40 typedef std::deque<T, alloc_type> test_type; 41 test_type v1; 42 test_type v2; 43 // this is a GNU extension for std::allocator 44 // static_assert( noexcept( v1 = std::move(v2) ), "Move assign cannot throw" ); 45 static_assert( noexcept( v1.swap(v2) ), "Swap cannot throw" ); 46} 47 48void test02() 49{ 50 typedef propagating_allocator<T, false> alloc_type; 51 typedef std::deque<T, alloc_type> test_type; 52 test_type v1(alloc_type(1)); 53 test_type v2(alloc_type(2)); 54 static_assert( !noexcept( v1 = std::move(v2) ), "Move assign can throw" ); 55 static_assert( noexcept( v1.swap(v2) ), "Swap cannot throw" ); 56} 57 58void test03() 59{ 60 typedef propagating_allocator<T, true> alloc_type; 61 typedef std::deque<T, alloc_type> test_type; 62 test_type v1(alloc_type(1)); 63 test_type v2(alloc_type(2)); 64 // static_assert( noexcept( v1 = std::move(v2) ), "Move assign cannot throw" ); 65 // noexcept spec of deque::swap depends on swap overload at top of this file 66 static_assert( !noexcept( v1.swap(v2) ), "Swap can throw" ); 67} 68