Microsoft KB Archive/148255

From BetaArchive Wiki

Article ID: 148255

Article Last Modified on 7/5/2005



APPLIES TO

  • Microsoft Visual C++ 4.0 Professional Edition
  • Microsoft Visual C++ 4.1 Subscription
  • Microsoft Visual C++ 4.2 Professional Edition
  • Microsoft Visual C++ 4.2 Enterprise Edition
  • Microsoft Visual C++ 5.0 Learning Edition
  • Microsoft Visual C++ 5.0 Learning Edition



This article was previously published under Q148255

SYMPTOMS

When an argument in a function call is passed by value and is cast to a base class from a derived class that is also a friend of the base class, the compiler generates this error:

fatal error C1001: INTERNAL COMPILER ERROR
(compiler file '\school.tp3\test\c10\src\P2\386\codegen.c', line 359)

This occurs only when C++ exception handling is enabled (/GX) and the base class defines a destructor.

RESOLUTION

There are several workarounds:

  • Pass the class by reference. -or-


  • Remove the cast. It is unnecessary. -or-


  • Do not use the /GX compiler option if exception handling isn't required.


STATUS

Microsoft has confirmed this to be a bug in the Microsoft products listed at the beginning of this article. This bug was corrected in Visual C++ version 5.0.

MORE INFORMATION

Sample Code to Reproduce Problem

  /* Compile options needed: /GX
   */ 

   class  Cbase {
      friend class Cfriend;
   public:
      ~Cbase( void ) {}
   };


   class Cfriend : public Cbase {};

   void f(Cbase z){}
   //   Workaround 1,pass by reference instead of by value
   //void f(Cbase& z) {}

   void main() {
      Cfriend P;
      // INTERNAL COMPILER ERROR on the following line
      f((Cbase)P);
   //   Workaround 2, do not use a cast.
   //   f(P);
   };
                


Additional query words: 10.00 10.10 10.20 utilities

Keywords: kbbug kbfix kbprogramming kbcpponly kbcompiler KB148255