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

Last reviewed: September 18, 1997
Article ID: Q131312
2.00 2.10 WINDOWS NT kbtool kbfixlist

The information in this article applies to:

  • The 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 reference words: 9.00 9.0 2.00 2.10 9.10 9.1
KBCategory: kbtool kbfixlist kbbuglist
KBSubCategory: CPPIss
Keywords : kbbuglist kbfixlist kbtool
Version : 2.00 2.10
Platform : NT WINDOWS
Solution Type : kbfix


THE INFORMATION PROVIDED IN THE MICROSOFT KNOWLEDGE BASE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND. MICROSOFT DISCLAIMS ALL WARRANTIES, EITHER EXPRESS OR IMPLIED, INCLUDING THE WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL MICROSOFT CORPORATION OR ITS SUPPLIERS BE LIABLE FOR ANY DAMAGES WHATSOEVER INCLUDING DIRECT, INDIRECT, INCIDENTAL, CONSEQUENTIAL, LOSS OF BUSINESS PROFITS OR SPECIAL DAMAGES, EVEN IF MICROSOFT CORPORATION OR ITS SUPPLIERS HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. SOME STATES DO NOT ALLOW THE EXCLUSION OR LIMITATION OF LIABILITY FOR CONSEQUENTIAL OR INCIDENTAL DAMAGES SO THE FOREGOING LIMITATION MAY NOT APPLY.

Last reviewed: September 18, 1997
© 1998 Microsoft Corporation. All rights reserved. Terms of Use.