15a83710eSEric Fiselier //===----------------------------------------------------------------------===//
25a83710eSEric Fiselier //
357b08b09SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
457b08b09SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
557b08b09SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
65a83710eSEric Fiselier //
75a83710eSEric Fiselier //===----------------------------------------------------------------------===//
85a83710eSEric Fiselier 
95a83710eSEric Fiselier // <ostream>
105a83710eSEric Fiselier 
115a83710eSEric Fiselier // template <class charT, class traits = char_traits<charT> >
125a83710eSEric Fiselier // class basic_ostream::sentry;
135a83710eSEric Fiselier 
145a83710eSEric Fiselier // explicit sentry(basic_ostream<charT,traits>& os);
155a83710eSEric Fiselier 
165a83710eSEric Fiselier #include <ostream>
175a83710eSEric Fiselier #include <cassert>
185a83710eSEric Fiselier 
19*7fc6a556SMarshall Clow #include "test_macros.h"
20*7fc6a556SMarshall Clow 
215a83710eSEric Fiselier int sync_called = 0;
225a83710eSEric Fiselier 
235a83710eSEric Fiselier template <class CharT>
245a83710eSEric Fiselier struct testbuf1
255a83710eSEric Fiselier     : public std::basic_streambuf<CharT>
265a83710eSEric Fiselier {
testbuf1testbuf1275a83710eSEric Fiselier     testbuf1() {}
285a83710eSEric Fiselier 
295a83710eSEric Fiselier protected:
305a83710eSEric Fiselier 
synctestbuf1315a83710eSEric Fiselier     int virtual sync()
325a83710eSEric Fiselier     {
335a83710eSEric Fiselier         ++sync_called;
345a83710eSEric Fiselier         return 1;
355a83710eSEric Fiselier     }
365a83710eSEric Fiselier };
375a83710eSEric Fiselier 
main(int,char **)382df59c50SJF Bastien int main(int, char**)
395a83710eSEric Fiselier {
405a83710eSEric Fiselier     {
415a83710eSEric Fiselier         std::ostream os((std::streambuf*)0);
425a83710eSEric Fiselier         std::ostream::sentry s(os);
435a83710eSEric Fiselier         assert(!bool(s));
445a83710eSEric Fiselier     }
455a83710eSEric Fiselier     {
465a83710eSEric Fiselier         testbuf1<char> sb;
475a83710eSEric Fiselier         std::ostream os(&sb);
485a83710eSEric Fiselier         std::ostream::sentry s(os);
495a83710eSEric Fiselier         assert(bool(s));
505a83710eSEric Fiselier     }
515a83710eSEric Fiselier     {
525a83710eSEric Fiselier         testbuf1<char> sb;
535a83710eSEric Fiselier         std::ostream os(&sb);
545a83710eSEric Fiselier         testbuf1<char> sb2;
555a83710eSEric Fiselier         std::ostream os2(&sb2);
565a83710eSEric Fiselier         os.tie(&os2);
575a83710eSEric Fiselier         assert(sync_called == 0);
585a83710eSEric Fiselier         std::ostream::sentry s(os);
595a83710eSEric Fiselier         assert(bool(s));
605a83710eSEric Fiselier         assert(sync_called == 1);
615a83710eSEric Fiselier     }
622df59c50SJF Bastien 
632df59c50SJF Bastien   return 0;
645a83710eSEric Fiselier }
65