67 lines · cpp
1//===----------------------------------------------------------------------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8 9// <streambuf>10 11// template <class charT, class traits = char_traits<charT> >12// class basic_streambuf;13 14// streamsize xsputn(const char_type* s, streamsize n);15 16// Test https://llvm.org/PR14074. The bug is really inside17// basic_streambuf, but I can't seem to reproduce without going through one18// of its derived classes.19 20// UNSUPPORTED: no-filesystem21 22#include <cassert>23#include <cstddef>24#include <cstdio>25#include <fstream>26#include <sstream>27#include <string>28#include "test_macros.h"29#include "platform_support.h"30 31 32// Count the number of bytes in a file -- make sure to use only functionality33// provided by the C library to avoid relying on the C++ library, which we're34// trying to test.35static std::size_t count_bytes(char const* filename) {36 std::FILE* f = std::fopen(filename, "rb");37 std::size_t count = 0;38 while (std::fgetc(f) != EOF)39 ++count;40 std::fclose(f);41 return count;42}43 44int main(int, char**) {45 {46 // with basic_stringbuf47 std::basic_stringbuf<char> buf;48 std::streamsize sz = buf.sputn("\xFF", 1);49 assert(sz == 1);50 assert(buf.str().size() == 1);51 }52 {53 // with basic_filebuf54 std::string temp = get_temp_file_name();55 {56 std::basic_filebuf<char> buf;57 buf.open(temp.c_str(), std::ios_base::out);58 std::streamsize sz = buf.sputn("\xFF", 1);59 assert(sz == 1);60 }61 assert(count_bytes(temp.c_str()) == 1);62 std::remove(temp.c_str());63 }64 65 return 0;66}67