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

ID: Q131312


The information in this article applies to:
  • Microsoft C/C++ Compiler (CL.EXE), included with:
    • Microsoft Visual C++ 32-bit Edition, versions 2.0, 2.1


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

} 

Additional query words: 9.00 9.0 2.00 2.10 9.10 9.1

Keywords :
Version : :2.0,2.1
Platform : NT WINDOWS
Issue type :


Last Reviewed: January 19, 2000
© 2000 Microsoft Corporation. All rights reserved. Terms of Use.