111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert//===----------------------------------------------------------------------===// 211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// 311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// The LLVM Compiler Infrastructure 411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// 511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// This file is dual licensed under the MIT and the University of Illinois Open 611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// Source Licenses. See LICENSE.TXT for details. 711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// 811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert//===----------------------------------------------------------------------===// 911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 1011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// XFAIL: libcpp-no-exceptions 1111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// REQUIRES: locale.en_US.UTF-8 1211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// REQUIRES: locale.fr_FR.UTF-8 1311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 1411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// <ios> 1511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 1611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// template <class charT, class traits> class basic_ios 1711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 1811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// basic_ios& copyfmt(const basic_ios& rhs); 1911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 2011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include <ios> 2111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include <streambuf> 2211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include <cassert> 2311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 2411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include "platform_support.h" // locale name macros 2511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 2611cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct testbuf 2711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert : public std::streambuf 2811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{ 2911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}; 3011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 3111cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool f1_called = false; 3211cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool f2_called = false; 3311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 3411cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool g1_called = false; 3511cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool g2_called = false; 3611cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool g3_called = false; 3711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 3811cd02dfb91661c65134cac258cf5924270e9d2Dan Albertvoid f1(std::ios_base::event ev, std::ios_base& stream, int index) 3911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{ 4011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert if (ev == std::ios_base::erase_event) 4111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { 4211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert(!f1_called); 4311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert( f2_called); 4411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert(!g1_called); 4511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert(!g2_called); 4611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert(!g3_called); 4711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert(stream.getloc().name() == LOCALE_en_US_UTF_8); 4811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert(index == 4); 4911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert f1_called = true; 5011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 5111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert} 5211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 5311cd02dfb91661c65134cac258cf5924270e9d2Dan Albertvoid f2(std::ios_base::event ev, std::ios_base& stream, int index) 5411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{ 5511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert if (ev == std::ios_base::erase_event) 5611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { 5711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert(!f1_called); 5811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert(!f2_called); 5911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert(!g1_called); 6011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert(!g2_called); 6111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert(!g3_called); 6211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert(stream.getloc().name() == LOCALE_en_US_UTF_8); 6311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert(index == 5); 6411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert f2_called = true; 6511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 6611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert} 6711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 6811cd02dfb91661c65134cac258cf5924270e9d2Dan Albertvoid g1(std::ios_base::event ev, std::ios_base& stream, int index) 6911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{ 7011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert if (ev == std::ios_base::copyfmt_event) 7111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { 7211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert( f1_called); 7311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert( f2_called); 7411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert(!g1_called); 7511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert( g2_called); 7611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert( g3_called); 7711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert(stream.getloc().name() == LOCALE_fr_FR_UTF_8); 7811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert(index == 7); 7911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert g1_called = true; 8011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 8111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert} 8211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 8311cd02dfb91661c65134cac258cf5924270e9d2Dan Albertvoid g2(std::ios_base::event ev, std::ios_base& stream, int index) 8411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{ 8511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert if (ev == std::ios_base::copyfmt_event) 8611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { 8711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert( f1_called); 8811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert( f2_called); 8911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert(!g1_called); 9011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert(!g2_called); 9111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert( g3_called); 9211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert(stream.getloc().name() == LOCALE_fr_FR_UTF_8); 9311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert(index == 8); 9411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert g2_called = true; 9511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 9611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert} 9711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 9811cd02dfb91661c65134cac258cf5924270e9d2Dan Albertvoid g3(std::ios_base::event ev, std::ios_base& stream, int index) 9911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{ 10011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert if (ev == std::ios_base::copyfmt_event) 10111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { 10211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert( f1_called); 10311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert( f2_called); 10411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert(!g1_called); 10511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert(!g2_called); 10611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert(!g3_called); 10711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert(stream.getloc().name() == LOCALE_fr_FR_UTF_8); 10811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert(index == 9); 10911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert g3_called = true; 11011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 11111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert} 11211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 11311cd02dfb91661c65134cac258cf5924270e9d2Dan Albertint main() 11411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{ 11511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert testbuf sb1; 11611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert std::ios ios1(&sb1); 11711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert ios1.flags(std::ios::boolalpha | std::ios::dec | std::ios::fixed); 11811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert ios1.precision(1); 11911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert ios1.width(11); 12011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert ios1.imbue(std::locale(LOCALE_en_US_UTF_8)); 12111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert ios1.exceptions(std::ios::failbit); 12211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert ios1.setstate(std::ios::eofbit); 12311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert ios1.register_callback(f1, 4); 12411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert ios1.register_callback(f2, 5); 12511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert ios1.iword(0) = 1; 12611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert ios1.iword(1) = 2; 12711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert ios1.iword(2) = 3; 12811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert char c1, c2, c3; 12911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert ios1.pword(0) = &c1; 13011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert ios1.pword(1) = &c2; 13111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert ios1.pword(2) = &c3; 13211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert ios1.tie((std::ostream*)1); 13311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert ios1.fill('1'); 13411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 13511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert testbuf sb2; 13611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert std::ios ios2(&sb2); 13711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert ios2.flags(std::ios::showpoint | std::ios::uppercase); 13811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert ios2.precision(2); 13911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert ios2.width(12); 14011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert ios2.imbue(std::locale(LOCALE_fr_FR_UTF_8)); 14111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert ios2.exceptions(std::ios::eofbit); 14211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert ios2.setstate(std::ios::goodbit); 14311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert ios2.register_callback(g1, 7); 14411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert ios2.register_callback(g2, 8); 14511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert ios2.register_callback(g3, 9); 14611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert ios2.iword(0) = 4; 14711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert ios2.iword(1) = 5; 14811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert ios2.iword(2) = 6; 14911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert ios2.iword(3) = 7; 15011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert ios2.iword(4) = 8; 15111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert ios2.iword(5) = 9; 15211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert char d1, d2; 15311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert ios2.pword(0) = &d1; 15411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert ios2.pword(1) = &d2; 15511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert ios2.tie((std::ostream*)2); 15611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert ios2.fill('2'); 15711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 15811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert ios1.copyfmt(ios1); 15911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert(!f1_called); 16011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 16111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert try 16211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { 16311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert ios1.copyfmt(ios2); 16411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert(false); 16511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 16611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert catch (std::ios_base::failure&) 16711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { 16811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 16911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert(ios1.rdstate() == std::ios::eofbit); 17011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert(ios1.rdbuf() == &sb1); 17111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert(ios1.flags() == (std::ios::showpoint | std::ios::uppercase)); 17211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert(ios1.precision() == 2); 17311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert(ios1.width() == 12); 17411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert(ios1.getloc().name() == LOCALE_fr_FR_UTF_8); 17511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert(ios1.exceptions() == std::ios::eofbit); 17611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert(f1_called); 17711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert(f2_called); 17811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert(g1_called); 17911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert(g2_called); 18011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert(g3_called); 18111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert(ios1.iword(0) == 4); 18211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert(ios1.iword(1) == 5); 18311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert(ios1.iword(2) == 6); 18411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert(ios1.iword(3) == 7); 18511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert(ios1.iword(4) == 8); 18611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert(ios1.iword(5) == 9); 18711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert(ios1.pword(0) == &d1); 18811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert(ios1.pword(1) == &d2); 18911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert(ios1.tie() == (std::ostream*)2); 19011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert(ios1.fill() == '2'); 19111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert} 192