Fixes are available
July 2012 PTF for XL C/C++ for AIX, V11.1
October 2012 PTF for XL C/C++ for AIX, V11.1
February 2013 PTF for XL C/C++ for AIX, V11.1
XL C/C++ for AIX Fix Pack 14 (May 2013 PTF) for 11.1
XL C/C++ for AIX Fix Pack 15 (August 2013 PTF) for 11.1
XL C/C++ for AIX Fix Pack 16 (November 2013 PTF) for 11.1
XL C/C++ for AIX Fix Pack 17 (February 2014 PTF) for 11.1
XL C/C++ for AIX Fix Pack 18 (May 2014 PTF) for 11.1
XL C/C++ for AIX Fix Pack 19 (August 2014 PTF) for 11.1
XL C/C++ for AIX Fix Pack 20 (November 2014 PTF) for 11.1
XL C/C++ for AIX Fix Pack 21 (April 2015 PTF) for 11.1
XL C/C++ for AIX Fix Pack 22 (September 2015 PTF) for 11.1
XL C/C++ for AIX Fix Pack 23 (March 2016 PTF) for 11.1
XL C/C++ for AIX Fix Pack 24 (September 2016 PTF) for 11.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
IV21490
Reported component name
XL C/C++ AIX
Reported component ID
5724X1300
Reported release
B10
Status
CLOSED PER
PE
NoPE
HIPER
NoHIPER
Special Attention
NoSpecatt
Submitted date
2012-05-18
Closed date
2012-07-05
Last modified date
2012-07-05
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++ AIX
Fixed component ID
5724X1300
Applicable component levels
RB10 PSY U852967
UP C
Document Information
Modified date:
05 July 2012