| compatmode(str, st), compatstatic(str, st), compatrefs(str, st) ⊦ throw(r, mkclasstype(class)) = noval ∨ is_break_mode(throw(r, mkclasstype(class))) ∨ throw(r, mkclasstype(class)) = return(noval, void_type) ∨ is_return_mode(throw(r, mkclasstype(class))) ∧ compat(str, throw(r, mkclasstype(class)) .val, throw(r, mkclasstype(class)) .type, st[_mode, throw(r, mkclasstype(class))]) ∨ is_throw_mode(throw(r, mkclasstype(class))) ∧ throw(r, mkclasstype(class)) .refval ≠ jvmref ∧ compat(str, refval(throw(r, mkclasstype(class)) .refval), throw(r, mkclasstype(class)) .type, st[_mode, throw(r, mkclasstype(class))]) ∧ is_subtype(str, throw(r, mkclasstype(class)) .type, mkclasstype(`java.lang.Throwable' .class)) ↔ class ≤ `java.lang.Throwable' .class ∧ r ≠ jvmref ∧ compat(str, refval(r), mkclasstype(class), st) |
compatmode(str, st), compatstatic(str, st), compatrefs(str, st) ⊦ compat(str, refval(r), mkclasstype(class), st[_mode, throw(r, mkclasstype(class))]) ∧ is_subtype(str, mkclasstype(class), mkclasstype(`java.lang.Throwable' .class)) ↔ class ≤ `java.lang.Throwable' .class ∧ compat(str, refval(r), mkclasstype(class), st), r = jvmref
[[CONCRETESIMPRULES : ([CSIMPSEQ : ⊦ throw(r, ty) .type = ty], [CSIMPSEQ : ⊦ throw(r, ty) .refval = r], [CSIMPSEQ : ⊦ is_throw_mode(throw(r, ty))], [CSIMPSEQ : ⊦ ¬ is_return_mode(throw(r, ty))], [CSIMPSEQ : ⊦ return(val, ty) ≠ throw(r, ty0)], [CSIMPSEQ : ⊦ ¬ is_break_mode(throw(r, ty))], [CSIMPSEQ : ⊦ noval ≠ throw(r, ty)])]]