1// 2000-09-11 Benjamin Kosnik <bkoz@redhat.com> 2 3// Copyright (C) 2000 Free Software Foundation 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// 22.1.2 locale globals [lib.locale.global.templates] 22 23#include <cwchar> // for mbstate_t 24#include <locale> 25#include <testsuite_hooks.h> 26 27typedef std::codecvt<char, char, std::mbstate_t> ccodecvt; 28 29class gnu_codecvt: public ccodecvt { }; 30 31void test01() 32{ 33 using namespace std; 34 35 bool test __attribute__((unused)) = true; 36 37 // construct a locale object with the C facet 38 const locale& cloc = locale::classic(); 39 // sanity check the constructed locale has the normal facet 40 VERIFY( has_facet<ccodecvt>(cloc) ); 41 42 // construct a locale object with the specialized facet. 43 locale loc(locale::classic(), new gnu_codecvt); 44 // sanity check the constructed locale has the specialized facet. 45 VERIFY( has_facet<gnu_codecvt>(loc) ); 46 47 try 48 { const ccodecvt& cvt01 __attribute__((unused)) = use_facet<ccodecvt>(cloc); } 49 catch(...) 50 { VERIFY( false ); } 51 52 try 53 { const gnu_codecvt& cvt02 __attribute__((unused)) = use_facet<gnu_codecvt>(loc); } 54 catch(...) 55 { VERIFY( false ); } 56 57 try 58 { const ccodecvt& cvt03 __attribute__((unused)) = use_facet<gnu_codecvt>(cloc); } 59 catch(bad_cast& obj) 60 { VERIFY( true ); } 61 catch(...) 62 { VERIFY( false ); } 63} 64 65int main () 66{ 67 test01(); 68 69 return 0; 70} 71