IBM Support

LI77052: DYNAMIC_CAST FAILING TO RECOGNIZE TYPE

Subscribe

You can track all active APARs for this component.

APAR status

  • Closed as program error.

Error description

  • When doing a reference downcast using dynamic_cast with
    classes from an inheritance tree that includes virtual private
    or virtual protected inheritance, the dynamic_cast is failing
    and throwing an incorrect bad_cast exception.
    
         ===== TEST CASE =====
    
    #include <iostream>
    #include <typeinfo>
    
    using namespace std;
    
    class B
    {
       public: virtual void val() { printf("Class B\n"); }
    };
    
    class C : protected B
    {
       public: virtual void val() { printf("Class C\n"); }
    };
    
    class D : virtual public C
    {
       public: virtual void val() { printf("Class D\n"); }
    };
    
    int main()
    {
       C c;
       D d;
    
       C& cp1 = d;
       try
       {
        D& dp1 = dynamic_cast<D&>(cp1);
        cout << "good cast" << endl;
        dp1.val();
       }
       catch (std::bad_cast &e)
       {
        cout << "bad cast" << endl;
       }
    }
    
    
    $ $cdir11com/xlC -qrtti test2.cpp
    $ ./a.out
    bad cast
    $
    

Local fix

  • Replacing the reference dynamic_cast with a pointer dynamic_cast
    might cast the class correctly.
    

Problem summary

  • PROBLEM DESCRIPTION:
    Internal class structure information was calculated incorrectly
    at compile time.  This incorrect data was then used by the
    runtime reference dynamic_cast feature, resulting in an invalid
    bad_cast exception.  The class information used by the pointer
    dynamic_cast
    
    USERS AFFECTED:
    Users of reference dynamic_casts.
    

Problem conclusion

  • The issue was corrected in the compiler, and the runtime
    dynamic_cast now works correctly.
    

Temporary fix

Comments

APAR Information

  • APAR number

    LI77052

  • Reported component name

    XL C/C++ FOR LI

  • Reported component ID

    5724X1400

  • Reported release

    B10

  • Status

    CLOSED PER

  • PE

    NoPE

  • HIPER

    NoHIPER

  • Special Attention

    NoSpecatt / Xsystem

  • Submitted date

    2012-10-10

  • Closed date

    2012-10-10

  • Last modified date

    2012-10-10

  • APAR is sysrouted FROM one or more of the following:

    IV21490

  • APAR is sysrouted TO one or more of the following:

Fix information

  • Fixed component name

    XL C/C++ FOR LI

  • Fixed component ID

    5724X1400

Applicable component levels



Document information

More support for: XL C/C++ for Linux

Software version: B10

Reference #: LI77052

Modified date: 10 October 2012