1// Vector iterator invalidation tests 2 3// Copyright (C) 2003, 2004, 2005 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 2, 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 COPYING. If not, write to the Free 18// Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, 19// USA. 20 21// We need to be pedantic about reallocations for this testcase to be correct. 22// { dg-options "-D_GLIBCXX_DEBUG_PEDANTIC" } 23 24#ifndef _GLIBCXX_DEBUG_PEDANTIC 25# define _GLIBCXX_DEBUG_PEDANTIC 1 26#endif 27 28#include <debug/vector> 29#include <testsuite_hooks.h> 30 31using __gnu_debug::vector; 32 33bool test = true; 34 35// Insert 36void test03() 37{ 38 vector<int> v(10, 17); 39 v.reserve(30); 40 41 // Insert a single element 42 vector<int>::iterator before = v.begin() + 6; 43 vector<int>::iterator at = before + 1; 44 vector<int>::iterator after = at; 45 at = v.insert(at, 42); 46 VERIFY(before._M_dereferenceable()); 47 VERIFY(at._M_dereferenceable()); 48 VERIFY(after._M_singular()); 49 50 // Insert multiple copies 51 before = v.begin() + 6; 52 at = before + 1; 53 v.insert(at, 3, 42); 54 VERIFY(before._M_dereferenceable()); 55 VERIFY(at._M_singular()); 56 57 // Insert iterator range 58 static int data[] = { 2, 3, 5, 7 }; 59 before = v.begin() + 6; 60 at = before + 1; 61 v.insert(at, &data[0], &data[0] + 4); 62 VERIFY(before._M_dereferenceable()); 63 VERIFY(at._M_singular()); 64 65 // Insert with reallocation 66 before = v.begin() + 6; 67 at = before + 1; 68 v.insert(at, 30, 17); 69 VERIFY(before._M_singular()); 70 VERIFY(at._M_singular()); 71 72 // Single insert with reallocation 73 vector<int> v2; 74 v2.reserve(100); 75 at = v2.begin(); 76 v2.insert(at, 100, 17); 77 at = v2.end() - 1; 78 before = v2.begin(); 79 VERIFY(at._M_dereferenceable()); 80 VERIFY(before._M_dereferenceable()); 81 at = v2.insert(at, 42); 82 VERIFY(at._M_dereferenceable()); 83 VERIFY(before._M_singular()); 84} 85 86int main() 87{ 88 test03(); 89 return 0; 90} 91