microsoft / microsoft/STL

`<sstream>`: basic_stringbuf C++20 constructors call _Getal()/_Release_to_buffer() breaks user specializations of basic_string

Open
#6,374 4 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

bug vNext
Dominant language
C++
Stars
11.2k
Forks
1.7k
Avg merge
4d 15h
Merged PRs (30d)
22

Description

Command-line test case

#include <sstream>
#include <string>

namespace std {
    template<>
    class basic_string<MyChar> 
    { /* minimal impl */ };
}

// Triggers C2039: '_Getal' is not a member of std::basic_string<MyChar>
std::basic_istringstream<MyChar> s;

With /std:c++20, including and using std::basic_istringstream where std::basic_string is explicitly specialized produces:

C:\Program Files\Microsoft Visual Studio\2022\Professional\VC\Tools\MSVC\14.44.35207\include\sstream(50): error C2039: "_Getal" ist kein Member von "std::basic_string<MyChar,std::char_traits,std::allocator>".
Siehe Deklaration von "std::basic_string<MyChar,std::char_traits,std::allocator>"

The C++20 constructor basic_stringbuf(basic_string<E,T,A>&&, openmode) calls _Str._Getal() and subsequently _Str._Release_to_buffer(), both of which are MSVC-internal implementation details absent from user specializations. The same code compiles without error in C++17 mode and on GCC/Clang.

Expected behavior

Instantiating std::basic_istringstream<T>, std::basic_ostringstream<T>, or std::basic_stringstream<T> with a user-defined character type T whose std::basic_string<T> is explicitly specialized should compile without errors.

The C++ standard ([namespace.std] p2) permits adding explicit specializations of standard library class templates to namespace std for program-defined types, provided the specialization meets the standard library requirements for the original template. Footnote 140 further states:

"Any library code that instantiates other library templates must be prepared to work adequately with any user-supplied specialization that meets the minimum requirements of this document."

std::basic_stringbuf<T> is standard library code that instantiates std::basic_string<T>. It must therefore work with any conforming user specialization of std::basic_string<T>. The implementation should not require the presence of MSVC-internal methods (_Getal, _Release_to_buffer) that are not part of the std::basic_string interface mandated by the standard and that cannot be present on a user-provided specialization.

STL version

Microsoft (R) C/C++-Optimierungscompiler Version 19.44.35226 für x64

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Start in the implementation at the C++20 basic_stringbuf constructor that calls _Getal() and _Release_to_buffer(). Reproduce the supplied explicit basic_string specialization with basic_istringstream, basic_ostringstream, and basic_stringstream, then verify that the cases compile in C++20 without relying on those MSVC-internal members.

Written by the indexing model from the issue text.

Assessment

Tech stack
cpp
Domain
tooling
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Active
Clarity
Clearly specified
Newbie friendliness
55/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.