-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathhang76.cpp
1 lines (1 loc) · 6.8 KB
/
hang76.cpp
1
struct A { int m ; virtual ~A ( ) {}} ; struct B : virtual A { int m ; } ; struct C : virtual A { int m ; } ; struct AA : A { int m ; } ; struct D : B , C , AA { 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 ; } void fnaa ( AA *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 { fnd ( d ) ; } catch ( A *p ) { abort ( ) ; } catch ( AA *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 { fna ( ( AA * ) d ) ; } catch ( AA *p ) { abort ( ) ; } catch ( A *p ) { caught = 1 ; if ( p ! = ( AA * ) 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 ! = 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 ( ) ; caught = 0 ; try { fnaa ( ( AA * ) d ) ; } catch ( A *p ) { caught = 1 ; if ( p ! = ( AA * ) d ) abort ( ) ; } catch ( ... ) { abort ( ) ; } if ( ! caught ) abort ( ) ; caught = 0 ; try { fnaa ( ( AA * ) d ) ; } catch ( AA *p ) { caught = 1 ; if ( p ! = d ) abort ( ) ; } catch ( ... ) { abort ( ) ; } if ( ! caught ) abort ( ) ; caught = 0 ; try { fnaa ( ( AA * ) d ) ; } catch ( C *p ) { abort ( ) ; } 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 ; virtual ~A ( ) {}} ; struct B : virtual A { int m ; } ; struct C : virtual A { int m ; } ; struct AA : A { int m ; } ; struct D : B , C , AA { 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 ; } void fnaa ( AA *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 { fnd ( d ) ; } catch ( A *p ) { abort ( ) ; } catch ( AA *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 { fna ( ( AA * ) d ) ; } catch ( AA *p ) { abort ( ) ; } catch ( A *p ) } { caught = 1 ; if ( p ! = ( AA * ) 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 ! = 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 ( ) ; caught = 0 ; try { fnaa ( ( AA * ) d ) ; } catch ( A *p ) { caught = 1 ; if ( p ! = ( AA * ) d ) abort ( ) ; } catch ( ... ) { abort ( ) ; } if ( ! caught ) abort ( ) ; caught = 0 ; try { fnaa ( ( AA * ) d ) ; } catch ( AA *p ) { caught = 1 ; if ( p ! = d ) abort ( ) ; } catch ( ... ) { abort ( ) ; } if ( ! caught ) abort ( ) ; caught = 0 ; try { fnaa ( ( AA * ) d ) ; } catch ( C *p ) { abort ( ) ; } 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 ; }