2
0
mirror of https://github.com/boostorg/nowide.git synced 2026-01-19 04:22:12 +00:00

Handle difference in libc++ for filebuf

This commit is contained in:
Alexander Grund
2021-04-11 17:07:50 +02:00
parent fc3cec8bf9
commit 0db4b799bc

View File

@@ -143,14 +143,14 @@ void test_64_bit_seek(const std::string& filepath)
// Create a value which does not fit into a 32 bit value.
// Use an unsigned intermediate to have the truncation defined to wrap to 0
using unsigned_off_type = std::make_unsigned<nw::filebuf::off_type>::type;
const nw::filebuf::off_type offset = static_cast<unsigned_off_type>(std::uint64_t(1) << 33u);
nw::filebuf::off_type offset = static_cast<unsigned_off_type>(std::uint64_t(1) << 33u);
#ifdef BOOST_MSVC
#pragma warning(push)
#pragma warning(disable : 4127)
#endif
// coverity[result_independent_of_operands]
if((offset == nw::filebuf::off_type(0)))
if(offset == nw::filebuf::off_type(0))
return; // Can't use 64 bit offsets throught the API, so don't test anything
#ifdef BOOST_MSVC
#pragma warning(pop)
@@ -169,6 +169,11 @@ void test_64_bit_seek(const std::string& filepath)
TEST(buf.pubseekoff(0, std::ios_base::cur) == knownPos);
else
{
#if !BOOST_NOWIDE_USE_FILEBUF_REPLACEMENT
// libc++ may truncate the 64 bit value when calling fseek which yields an offset of 0
if(newPos == knownPos)
offset = 0; // LCOV_EXCL_LINE
#endif
TEST(newPos == offset + knownPos);
TEST(buf.pubseekoff(0, std::ios_base::cur) == newPos);
}
@@ -228,6 +233,7 @@ void test_swap(const std::string& filepath)
TEST(buf1.sputc('B') == 'B');
TEST(buf2.sbumpc() == 'H');
buf1.swap(buf2);
// Trying to read in write mode or other way round should fail
TEST(buf1.sputc('x') == eof);
TEST(buf2.sbumpc() == eof);
TEST(buf1.sbumpc() == 'e');
@@ -311,5 +317,9 @@ void test_main(int, char** argv, char**)
test_pubseekpos(exampleFilename);
test_pubseekoff(exampleFilename);
test_64_bit_seek(exampleFilename);
// These tests are only useful for the nowide filebuf and are known to fail for
// std::filebuf due to bugs in libc++
#if BOOST_NOWIDE_USE_FILEBUF_REPLACEMENT
test_swap(exampleFilename);
#endif
}