[Patch/RFC] Fix libstdc++/9533

Pétur Runólfsson peturr02@ru.is
Tue Mar 18 15:04:00 GMT 2003


Benjamin Kosnik wrote:
> I think it might be best to remove the patch for 6746 entirely, and
> start over.

I think is the only reasonable approach for the 3.3 branch, the
proposed changes to showmanyc seem way too complex to apply this
close to release.

By the way, shouldn't 9533 be changed to high priority? It is a
regression from 3.2.x and IMHO it is a show-stopper.

> My real wish is to separate out the buffered/unbuffered
> classes though, before much more work on this kind of issue happens.

I'm not sure that it is ever correct to use basic_filebuf as a
stream buffer for cin/cout/wcin/wcout etc.

Consider this fragment from 27.3:

  Mixing operations on corresponding wide- and narrow-character
  streams follows the same semantics as mixing such operations
  on FILEs, as specified in Amendment 1 of the ISO C standard.

I read this as meaning that this program:

#include <iostream>
#include <cstdio>
#include <cwchar>

int main()
{
	using namespace std;

	wint_t c1 = wcin.get();
	int c2 = cin.get();

	int n = fwide(stdin, 0);

	fprintf(stderr, "%d %d %d\n", c1, c2, n);

	c1 = wcout.put(L'a') ? L'a' : WEOF;
	c2 = cout.put('b') ? 'b' : EOF;

	n = fwide(stdout, 0);

	wcout.put(L'\n');
	fprintf(stderr, "%d %d %d\n", c1, c2, n);

	return 0;
}

Should have the same output as this program:

#include <cstdio>
#include <cwchar>

int main()
{
	using namespace std;

	wint_t c1 = getwc(stdin);
	int c2 = getc(stdin);

	int n = fwide(stdin, 0);

	fprintf(stderr, "%d %d %d\n", c1, c2, n);

	c1 = putwc(L'a', stdout);
	c2 = putc('b', stdout);

	n = fwide(stdout, 0);

	putwc(L'\n', stdout);
	fprintf(stderr, "%d %d %d\n", c1, c2, n);

	return 0;
}

I don't think that ios_base::sync_with_stdio(false) trumps the above
quote from 27.3, so this program:

#include <iostream>
#include <cstdio>
#include <cwchar>

int main()
{
	using namespace std;

	ios_base::sync_with_stdio(false);

	wint_t c1 = wcin.get();
	int c2 = cin.get();

	int n = fwide(stdin, 0);

	fprintf(stderr, "%d %d %d\n", c1, c2, n);

	c1 = wcout.put(L'a') ? L'a' : WEOF;
	c2 = cout.put('b') ? 'b' : EOF;

	n = fwide(stdout, 0);

	wcout.put(L'\n');
	fprintf(stderr, "%d %d %d\n", c1, c2, n);

	return 0;
}

should probably have the same output as the other two (except that
the return value of fwide may be unspecified).

Regards,
Petur



More information about the Libstdc++ mailing list