-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathhang84.cpp
More file actions
1 lines (1 loc) · 2.19 KB
/
hang84.cpp
File metadata and controls
1 lines (1 loc) · 2.19 KB
1
struct A { int m ; virtual ~A ( ) { } } ; struct B : virtual A { int m ; } ; struct C : virtual 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 ) { caught = 1 ; if ( p ! = d ) abort ( ) ; } catch ( ... ) { abort ( ) ; } if ( ! caught ) abort ( ) ; caught = 0 ; try { fnd ( d ) ; } catch ( B * p ) { caught = 1 ; if ( p ! = d ) abort ( ) ; } catch ( ... ) { abort ( ) ; } if ( ! caught ) abort ( ) ; caught = 0 ; try { fnd ( d ) ; } 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 ! = d ) abort ( ) ; } catch ( ... ) { abort ( ) ; } if ( ! caught ) abort ( ) ; caught = 0 ; try { fna ( ( C * ) d ) ; } catch ( C * p ) { abort ( ){ ; } catch ( A * p ) { caught = 1 ; if ( p ! = d ) abort ( ) ; } catch ( ... ) { abort ( ) ; } if ( ! caught ) abort ( ) ; caught = 0 ; try { fnb ( ( B * ) d ) ; } catch ( A * p ) { caught = 1 ; if ( p ! = 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 ! = 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 ; }