Fixes are available
April 2013 Update for XL C/C++ for Linux, V12.1
XL C/C++ for Linux Fix Pack 8 (October 2015 Update) for 12.1
December 2012 Update for XL C/C++ for Linux, V12.1
XL C/C++ for Linux Fix Pack 4 (October 2013 Update) for 12.1
XL C/C++ for Linux Fix Pack 5 (December 2013 Update) for 12.1
XL C/C++ for Linux Fix Pack 6 (February 2014 Update) for 12.1
XL C/C++ for Linux Fix Pack 7 (May 2014 Update) for 12.1
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
LI77139
Reported component name
XL C/C++ FOR LI
Reported component ID
5725C7300
Reported release
C10
Status
CLOSED PER
PE
NoPE
HIPER
NoHIPER
Special Attention
NoSpecatt
Submitted date
2012-12-17
Closed date
2012-12-17
Last modified date
2012-12-17
APAR is sysrouted FROM one or more of the following:
APAR is sysrouted TO one or more of the following:
Fix information
Fixed component name
XL C/C++ FOR LI
Fixed component ID
5725C7300
Applicable component levels
RC10 PSN IV21490
UP06/09/13
[{"Business Unit":{"code":"BU058","label":"IBM Infrastructure w\/TPS"},"Product":{"code":"SSXVZZ","label":"XL C\/C++ for Linux"},"Platform":[{"code":"PF025","label":"Platform Independent"}],"Version":"12.1","Line of Business":{"code":"LOB57","label":"Power"}}]
Document Information
Modified date:
14 October 2021