1 // 2003-07-06 Benjamin Kosnik <bkoz@redhat.com> 2 3 // Copyright (C) 2003-2021 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 #include <locale> 21 #include <sstream> 22 #include <ostream> 23 #include <testsuite_hooks.h> 24 25 class numpunct_checked : public std::numpunct<char> 26 { 27 typedef std::numpunct<char> base; 28 29 public: 30 explicit numpunct_checked(std::size_t refs=0)31 numpunct_checked(std::size_t refs = 0): base(refs) { } 32 33 string_type base_truename() const34 base_truename() const 35 { return base::do_truename(); } 36 37 protected: 38 virtual string_type do_truename() const39 do_truename() const 40 { return base::do_truename() + "st"; } 41 }; 42 43 // Thwart locale caching strategies that incorrectly overwrite base 44 // class data. test01()45void test01() 46 { 47 using namespace std; 48 49 const string basestr("true"); 50 const string derivedstr("truest"); 51 52 const locale loc(locale::classic(), new numpunct_checked); 53 stringbuf sbuf; 54 ostream os(&sbuf); 55 os.setf(ios_base::boolalpha); 56 57 // Pre-cache sanity check. 58 const numpunct<char>& np = use_facet<numpunct<char> >(loc); 59 VERIFY( np.truename() == derivedstr ); 60 61 // Cache. 62 os.imbue(loc); 63 os << true; 64 VERIFY( sbuf.str() == derivedstr ); 65 66 // Post-cache sanity check, make sure that base class is still fine. 67 VERIFY( np.truename() == derivedstr ); 68 const numpunct_checked& npd = static_cast<const numpunct_checked&>(np); 69 VERIFY( npd.base_truename() == basestr ); 70 } 71 main()72int main() 73 { 74 test01(); 75 return 0; 76 } 77