diff --git a/libcxx/include/sstream b/libcxx/include/sstream --- a/libcxx/include/sstream +++ b/libcxx/include/sstream @@ -620,7 +620,7 @@ if (__wch & ios_base::out) { this->setp(this->pbase(), this->epptr()); - this->pbump(__noff); + this->__pbump(__noff); } return pos_type(__noff); } diff --git a/libcxx/test/configs/cmake-bridge.cfg.in b/libcxx/test/configs/cmake-bridge.cfg.in --- a/libcxx/test/configs/cmake-bridge.cfg.in +++ b/libcxx/test/configs/cmake-bridge.cfg.in @@ -1,5 +1,7 @@ @AUTO_GEN_COMMENT@ +config.sizeof_void_p = @CMAKE_SIZEOF_VOID_P@ + @SERIALIZED_LIT_PARAMS@ # diff --git a/libcxx/test/std/input.output/string.streams/stringstream.members/gcount.pass.cpp b/libcxx/test/std/input.output/string.streams/stringstream.members/gcount.pass.cpp new file mode 100644 --- /dev/null +++ b/libcxx/test/std/input.output/string.streams/stringstream.members/gcount.pass.cpp @@ -0,0 +1,36 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +// UNSUPPORTED: libcxx-32-bits + +// Test that tellp() does not break the stringstream after INT_MAX, due to use +// of pbump() that accept int. + +#include +#include +#include +#include + +int main(int, char**) { + std::stringstream ss; + std::string payload(INT_MAX - 1, '\0'); + + ss.write(payload.data(), payload.size()); + assert(ss.tellp() == INT_MAX - 1); + + ss.write("a", 1); + assert(ss.tellp() == INT_MAX); + + ss.write("b", 1); + assert(ss.tellp() == INT_MAX + 1ULL); + // it fails only after previous tellp() corrupts the internal field with int + // overflow + assert(ss.tellp() == INT_MAX + 1ULL); + + return 0; +} diff --git a/libcxx/utils/libcxx/test/params.py b/libcxx/utils/libcxx/test/params.py --- a/libcxx/utils/libcxx/test/params.py +++ b/libcxx/utils/libcxx/test/params.py @@ -115,6 +115,15 @@ AddCompileFlag('-fno-rtti') ]), + Parameter(name='sizeof_void_p', type=int, + default=False, # None means not a libcxx tests (libunwind or libcxxabi) + help="sizeof(void *)", + actions=lambda sizeof_void_p: + [] if sizeof_void_p is False else + [AddFeature('libcxx-64-bits')] if sizeof_void_p == 8 else + [AddFeature('libcxx-32-bits')] + ), + Parameter(name='stdlib', choices=['llvm-libc++', 'apple-libc++', 'libstdc++', 'msvc'], type=str, default='llvm-libc++', help="""The C++ Standard Library implementation being tested.