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