-
Notifications
You must be signed in to change notification settings - Fork 0
/
hang69.cpp
1 lines (1 loc) · 5.28 KB
/
hang69.cpp
1
struct A { int m ; } ; struct B : A { int m ; } ; struct C : A { int m ; } ; struct D : B , C { int m ; } ; void fna ( A *obj ) { throw obj ; } void fnb ( B *obj ) { throw obj ; } void fnc ( C *obj ) { throw obj ; } void fnd ( D *obj ) { throw obj ; } extern "C" void abort ( ) ; void check ( D *d ) { int caught ; caught = 0 ; try { fnd ( d ) ; } catch ( A *p ) { abort ( ) ; } catch ( D *p ) { caught = 1 ; if ( p ! = d ) abort ( ) ; } catch ( ... ) { abort ( ) ; } if ( ! caught ) abort ( ) ; caught = 0 ; try { fnd ( d ) ; } catch ( A *p ) { abort ( ) ; } catch ( B *p ) { caught = 1 ; if ( p ! = d ) abort ( ) ; } catch ( ... ) { abort ( ) ; } if ( ! caught ) abort ( ) ; caught = 0 ; try { fnd ( d ) ; } catch ( A *p ) { abort ( ) ; } catch ( C *p ) { caught = 1 ; if ( p ! = d ) abort ( ) ; } catch ( ... ) { abort ( ) ; } if ( ! caught ) abort ( ) ; caught = 0 ; try { fna ( ( B * ) d ) ; } catch ( B *p ) { abort ( ) ; } catch ( A *p ) { caught = 1 ; if ( p ! = ( B * ) d ) abort ( ) ; } catch ( ... ) { abort ( ) ; } if ( ! caught ) abort ( ) ; caught = 0 ; try { fna ( ( C * ) d ) ; } catch ( C *p ) { abort ( ) ; } catch ( A *p ) { caught = 1 ; if ( p ! = ( C * ) d ) abort ( ) ; } catch ( ... ) { abort ( ) ; } if ( ! caught ) abort ( ) ; caught = 0 ; try { fnb ( ( B * ) d ) ; } catch ( A *p ) { caught = 1 ; if ( p ! = ( B * ) d ) abort ( ) ; } catch ( ... ) { abort ( ) ; } if ( ! caught ) abort ( ) ; caught = 0 ; try { fnb ( ( B * ) d ) ; } catch ( B *p ) { caught = 1 ; if ( p ! = ( B * ) d ) abort ( ) ; } catch ( ... ) { abort ( ) ; } if ( ! caught ) abort ( ) ; caught = 0 ; try { fnb ( ( B * ) d ) ; } catch< ( C *p ) { abort ( ) ; } catch ( D *p ) { abort ( ) ; } catch ( ... ) { caught = 1 ; } if ( ! caught ) abort ( ) ; caught = 0 ; try { fnc ( ( C * ) d ) ; } catch ( A *p ) { caught = 1 ; if ( p ! = ( C * ) d ) abort ( ) ; } catch ( ... ) { abort ( ) ; } if ( ! caught ) abort ( ) ; caught = 0 ; try { fnc ( ( C * ) d ) ; } catch ( C *p ) { caught = 1 ; if ( p ! = d ) abort ( ) ; } catch ( ... ) { abort ( ) ; } if ( ! caught ) abort ( ) ; caught = 0 ; try { fnc ( ( C * ) d ) ; } catch> ( B *p ) { abort ( ) ; } catch ( D *p ) { abort ( ) ; } catch ( ... ) { caught = 1 ; } if ( ! caught ) abort ( ) ; return ; } int main ( ) { D d ; check ( & d ) ; check ( ( D * ) 0 ) ; return 0 ; } struct A { int m ; } ; struct B : A { int m ; } ; struct C : A { int m ; } ; struct D : B , C { int m ; } ; void fna ( A *obj ) { throw obj ; } void fnb ( B *obj ) { throw obj ; } void fnc ( C *obj ) { throw obj ; } void fnd ( D *obj ) { throw obj ; } extern "C" void abort ( ) ; void check ( D *d ) { int caught ; caught = 0 ; try { fnd ( d ) ; } catch ( A *p ) { abort ( ) ; } catch ( D *p ) { caught = 1 ; if ( p ! = d ) abort ( ) ; } catch ( ... ) { abort ( ) ; } if ( ! caught ) abort ( ) ; caught = 0 ; try { fnd ( d ) ; } catch ( A *p ) { abort ( ) ; } catch ( B *p ) { caught = 1 ; if ( p ! = d ) abort ( ) ; } catch ( ... ) { abort ( ) ; } if ( ! caught ) abort ( ) ; caught = 0 ; try { fnd ( d ) ; } catch ( A *p ) { abort ( ) ; } catch ( C *p ) { caught = 1 ; if ( p ! = d ) abort ( ) ; } catch ( ... ) { abort ( ) ; } if ( ! caught ) abort ( ) ; caught = 0 ; try { fna ( ( B * ) d ) ; } catch ( B *p ) { abort ( ) { ; } catch ( A *p ) { caught = 1 ; if ( p ! = ( B * ) d ) abort ( ) ; } catch ( ... ) { abort ( ) ; } if ( ! caught ) abort ( ) ; caught = 0 ; try { fna ( ( C * ) d ) ; } catch ( C *p ) { abort ( ) ; } catch ( A *p ) { caught = 1 ; if ( p ! = ( C * ) d ) abort ( ) ; } catch ( ... ) { abort ( ) ; } if ( ! caught ) abort ( ) ; caught = 0 ; try { fnb ( ( B * ) d ) ; } catch ( A *p ) { caught = 1 ; if ( p ! = ( B * ) d ) abort ( ) ; } catch ( ... ) } { abort ( ) ; } if ( ! caught ) abort ( ) ; caught = 0 ; try { fnb ( ( B * ) d ) ; } catch ( B *p ) { caught = 1 ; if ( p ! = ( B * ) d ) abort ( ) ; } catch ( ... ) { abort ( ) ; } if ( ! caught ) abort ( ) ; caught = 0 ; try { fnb ( ( B * ) d ) ; } catch ( C *p ) { abort ( ) ; } catch ( D *p ) { abort ( ) ; } catch ( ... ) { caught = 1 ; } if ( ! caught ) abort ( ) ; caught = 0 ; try { fnc ( ( C * ) d ) ; } catch ( A *p ) { caught = 1 ; if ( p ! = ( C * ) d ) abort ( ) ; } catch ( ... ) { abort ( ) ; } if ( ! caught ) abort ( ) ; caught = 0 ; try { fnc ( ( C * ) d ) ; } catch ( C *p ) { caught = 1 ; if ( p ! = d ) abort ( ) ; } catch ( ... ) { abort ( ) ; } if ( ! caught ) abort ( ) ; caught = 0 ; try { fnc ( ( C * ) d ) ; } catch ( B *p ) { abort ( ) ; } catch ( D *p ) { abort ( ) ; } catch ( ... ) { caught = 1 ; } if ( ! caught ) abort ( ) ; return ; } int main ( ) { D d ; check ( & d ) ; check ( ( D * ) 0 ) ; return 0 ; }