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// REQUIRES: locale.fr_FR.UTF-8
1111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
1211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// <ios>
1311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
1411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// template <class charT, class traits> class basic_ios
1511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
1611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// void move(basic_ios&& rhs);
1711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
1811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include <ios>
1911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include <streambuf>
2011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include <cassert>
2111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
2211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include "platform_support.h" // locale name macros
2311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
2411cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct testbuf
2511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    : public std::streambuf
2611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{
2711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert};
2811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
2911cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct testios
3011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    : public std::ios
3111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{
3211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    testios() {}
3311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    testios(std::streambuf* p) : std::ios(p) {}
3411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    void move(std::ios& x) {std::ios::move(x);}
3511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert};
3611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
3711cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool f1_called = false;
3811cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool f2_called = false;
3911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
4011cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool g1_called = false;
4111cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool g2_called = false;
4211cd02dfb91661c65134cac258cf5924270e9d2Dan Albertbool g3_called = false;
4311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
4411cd02dfb91661c65134cac258cf5924270e9d2Dan Albertvoid f1(std::ios_base::event, std::ios_base&, int)
4511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{
4611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    f1_called = true;
4711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}
4811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
4911cd02dfb91661c65134cac258cf5924270e9d2Dan Albertvoid f2(std::ios_base::event, std::ios_base&, int)
5011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{
5111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    f2_called = true;
5211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}
5311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
5411cd02dfb91661c65134cac258cf5924270e9d2Dan Albertvoid g1(std::ios_base::event ev, std::ios_base&, int index)
5511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{
5611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    if (ev == std::ios_base::imbue_event)
5711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {
5811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        assert(index == 7);
5911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        g1_called = true;
6011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    }
6111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}
6211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
6311cd02dfb91661c65134cac258cf5924270e9d2Dan Albertvoid g2(std::ios_base::event ev, std::ios_base&, int index)
6411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{
6511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    if (ev == std::ios_base::imbue_event)
6611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {
6711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        assert(index == 8);
6811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        g2_called = true;
6911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    }
7011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}
7111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
7211cd02dfb91661c65134cac258cf5924270e9d2Dan Albertvoid g3(std::ios_base::event ev, std::ios_base&, int index)
7311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{
7411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    if (ev == std::ios_base::imbue_event)
7511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {
7611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        assert(index == 9);
7711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        g3_called = true;
7811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    }
7911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}
8011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
8111cd02dfb91661c65134cac258cf5924270e9d2Dan Albertint main()
8211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{
8311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    testios ios1;
8411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    testbuf sb2;
8511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    std::ios ios2(&sb2);
8611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    ios2.flags(std::ios::showpoint | std::ios::uppercase);
8711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    ios2.precision(2);
8811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    ios2.width(12);
8911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    ios2.imbue(std::locale(LOCALE_fr_FR_UTF_8));
9011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    ios2.exceptions(std::ios::eofbit);
9111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    ios2.setstate(std::ios::goodbit);
9211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    ios2.register_callback(g1, 7);
9311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    ios2.register_callback(g2, 8);
9411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    ios2.register_callback(g3, 9);
9511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    ios2.iword(0) = 4;
9611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    ios2.iword(1) = 5;
9711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    ios2.iword(2) = 6;
9811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    ios2.iword(3) = 7;
9911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    ios2.iword(4) = 8;
10011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    ios2.iword(5) = 9;
10111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    char d1, d2;
10211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    ios2.pword(0) = &d1;
10311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    ios2.pword(1) = &d2;
10411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    ios2.tie((std::ostream*)2);
10511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    ios2.fill('2');
10611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
10711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    ios1.move(ios2);
10811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
10911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    assert(ios1.rdstate() == std::ios::goodbit);
11011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    assert(ios1.rdbuf() == 0);
11111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    assert(ios1.flags() == (std::ios::showpoint | std::ios::uppercase));
11211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    assert(ios1.precision() == 2);
11311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    assert(ios1.width() == 12);
11411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    assert(ios1.getloc().name() == LOCALE_fr_FR_UTF_8);
11511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    assert(ios1.exceptions() == std::ios::eofbit);
11611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    assert(!f1_called);
11711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    assert(!f2_called);
11811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    assert(!g1_called);
11911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    assert(!g2_called);
12011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    assert(!g3_called);
12111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    assert(ios1.iword(0) == 4);
12211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    assert(ios1.iword(1) == 5);
12311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    assert(ios1.iword(2) == 6);
12411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    assert(ios1.iword(3) == 7);
12511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    assert(ios1.iword(4) == 8);
12611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    assert(ios1.iword(5) == 9);
12711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    assert(ios1.pword(0) == &d1);
12811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    assert(ios1.pword(1) == &d2);
12911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    assert(ios1.tie() == (std::ostream*)2);
13011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    assert(ios1.fill() == '2');
13111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    ios1.imbue(std::locale("C"));
13211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    assert(!f1_called);
13311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    assert(!f2_called);
13411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    assert(g1_called);
13511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    assert(g2_called);
13611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    assert(g3_called);
13711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
13811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    assert(ios2.rdbuf() == &sb2);
13911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    assert(ios2.tie() == 0);
14011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}
141