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