1// { dg-require-namedlocale "" } 2 3// 2000-08-31 Benjamin Kosnik <bkoz@redhat.com> 4 5// Copyright (C) 2000, 2002, 2003, 2005, 2009 Free Software Foundation 6// 7// This file is part of the GNU ISO C++ Library. This library is free 8// software; you can redistribute it and/or modify it under the 9// terms of the GNU General Public License as published by the 10// Free Software Foundation; either version 3, or (at your option) 11// any later version. 12 13// This library is distributed in the hope that it will be useful, 14// but WITHOUT ANY WARRANTY; without even the implied warranty of 15// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16// GNU General Public License for more details. 17 18// You should have received a copy of the GNU General Public License along 19// with this library; see the file COPYING3. If not see 20// <http://www.gnu.org/licenses/>. 21 22// 22.1.1.1.2 - class locale::facet [lib.locale.facet] 23 24#include <cwchar> // for mbstate_t 25#include <locale> 26#include <stdexcept> 27#include <string> 28#include <iterator> 29#include <limits> 30#include <testsuite_hooks.h> 31 32// Static counter for use in checking ctors/dtors. 33static std::size_t counter; 34 35class surf : public std::locale::facet 36{ 37public: 38 static std::locale::id id; 39 surf(size_t refs = 0): std::locale::facet(refs) { ++counter; } 40 ~surf() { --counter; } 41}; 42 43std::locale::id surf::id; 44 45typedef surf facet_type; 46 47void test02() 48{ 49 using namespace std; 50 bool test __attribute__((unused)) = true; 51 52 // 1: Destroyed when out of scope. 53 VERIFY( counter == 0 ); 54 { 55 locale loc01(locale::classic(), new facet_type); 56 VERIFY( counter == 1 ); 57 } 58 VERIFY( counter == 0 ); 59 60 // 2: Not destroyed when out of scope, deliberately leaked. 61 VERIFY( counter == 0 ); 62 { 63 // Default refs argument is zero. 64 locale loc02(locale::classic(), new facet_type(1)); 65 VERIFY( counter == 1 ); 66 } 67 VERIFY( counter == 1 ); 68 69 // 3: Pathological. 70 counter = 0; 71 { 72 // Test bounds. 73 facet_type* f = new facet_type(numeric_limits<size_t>::max()); 74 VERIFY( counter == 1 ); 75 // Add a reference. 76 locale loc01(locale::classic(), f); 77 { 78 // Add another reference... 79 locale loc02(locale::classic(), f); 80 } 81 VERIFY( counter == 1 ); 82 } 83 84 // 4: Named locale should destroy facets when it goes out of scope. 85 // Not quite sure how to test for this w/o valgrind at the moment. 86 { 87 locale loc03 = locale("es_MX"); 88 } 89} 90 91int main () 92{ 93 test02(); 94 return 0; 95} 96