Fixes are available
November 2012 PTF for XL C/C++ for AIX, V12.1
March 2013 PTF for XL C/C++ for AIX, V12.1
XL C/C++ for AIX Fix Pack 4 (June 2013 PTF) for 12.1
XL C/C++ for AIX Fix Pack 5 (September 2013 PTF) for 12.1
XL C/C++ for AIX Fix Pack 7 (January 2014 PTF) for 12.1
XL C/C++ for AIX Fix Pack 8 (March 2014 PTF) for 12.1
XL C/C++ for AIX Fix Pack 11 (February 2015 PTF) for 12.1
XL C/C++ for AIX Fix Pack 12 (May 2015 PTF) for 12.1
XL C/C++ for AIX Fix Pack 13 (August 2015 Update) for 12.1
XL C/C++ for AIX Fix Pack 14 (December 2015 Update) for 12.1
XL C/C++ for AIX Fix Pack 15 (April 2016 Update) for 12.1
XL C/C++ for AIX Fix Pack 16 (July 2016 Update) for 12.1
XL C/C++ for AIX Fix Pack 17 (November 2016 Update) for 12.1
XL C/C++ for AIX Fix Pack 18 (February 2017 Update) for 12.1
XL C/C++ for AIX Fix Pack 19 (August 2017 Update) for 12.1
XL C/C++ for AIX Fix Pack 20 (March 2018 Update) for 12.1
XL C/C++ for AIX Fix Pack 6 (December 2013 PTF) for 12.1
XL C/C++ for AIX Fix Pack 9 (July 2014 PTF) for 12.1
XL C/C++ for AIX Fix Pack 10 (October 2014 PTF) for 12.1
XL C/C++ for AIX Fix Pack 21 (January 2019 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
IV31735
Reported component name
XL C/C++ FOR AI
Reported component ID
5725C7200
Reported release
C10
Status
CLOSED PER
PE
NoPE
HIPER
NoHIPER
Special Attention
NoSpecatt / Xsystem
Submitted date
2012-11-09
Closed date
2012-11-09
Last modified date
2012-11-09
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 AI
Fixed component ID
5725C7200
Applicable component levels
RC10 PSN UP06/09/13
C
Document Information
Modified date:
21 August 2024