FIX: Manipulator Causes C1001 IC Error in MSC1.CPP Line 1056 (131312)



The information in this article applies to:

  • Microsoft Visual C++, 32-bit Professional Edition 2.0
  • Microsoft Visual C++, 32-bit Professional Edition 2.1

This article was previously published under Q131312

SYMPTOMS

The compiler generates the following compiler error:
fatal error C1001: INTERNAL COMPILER ERROR ( compiler file 'msc1.cpp', line 1056 )
This occurs when the code meets both of these conditions:

  • It contains a function template that overwrites the << operator (insertion operator) or the >> operator (extraction operator) for class ostream. For example:
          template <class T> ostream& operator<<( ostream&, T& ); //or
          template <class T> istream& operator>>( istream&, T& );
    						
  • It contains an expression of the form:
          iostream_specifier insertion/extraction_operator manipulator
    						
    For example:
          cout << endl;  // fails if template operator << was defined
          cout << flush; // fails if template operator << was defined
          cin >> ws;     // fails if template operator >> was defined
    						

RESOLUTION

The problem does not occur if an identifier of any type is inserted into the expression. For example, if 'a' is a variable (of any type):
   cout << a << endl;     // does not fail
   cout << '\n' << flush; // does not fail
   cin >> a >> ws;        // does not fail
				

STATUS

Microsoft has confirmed this to be a bug in the Microsoft products listed at the beginning of this article. This problem was fixed in Microsoft Visual C++, 32-bit Edition, version 4.0.

MORE INFORMATION

To demonstrate the workaround, change the lines marked "internal compiler error" into comments.

Sample Code to Demonstrate Problem

/* Compile options needed: none
*/ 

#include <iostream.h>
#include <strstrea.h>

template <class T> ostream& operator<< ( ostream&, T& );
template <class T> istream& operator>> ( istream&, T& );

void x(ostrstream &ot)
{
   int a;

   cout << endl;  // internal compiler error
   ot << flush;   // internal compiler error
   cin >> ws;     // internal compiler error
   cout << "test" << endl;  // no error
   ot << '\n' << flush;     // no error

   cin >> a >> ws;          // no error

}
				

Modification Type:MinorLast Reviewed:7/5/2005
Keywords:kbbug kbfix KB131312