Brendon Costa <[EMAIL PROTECTED]> writes: > The nodes that have me a little confused are: > > TRY_CATCH_EXPR > TRY_FINALLY_EXPR > MUST_NOT_THROW_EXPR > EH_FILTER_EXPR
Yes, those are a bit mysterious. > TRY_CATCH_EXPR/TRY_FINALLY_EXPR > When code generated from these nodes encounter an exception while > processing code from operand 0 is there an implicit rethrow of that > exception at the end of the block of code given by operand 1 or does it > "sink" the exception and only rethrow it if the user specifically > requests it (In C++ anyway)? If operand 0 throws an exception, there is an implicit rethrow after executing operand 1. (Of course, operand 1 can prevent that rethrow by doing its own throw, or by calling a function which does not return, etc.). > In what situations are these nodes generated? TRY_CATCH_EXPR is generated for C++ try { ... } catch (...) { } TRY_FINALLY_EXPR is generated for class C { ~C(); }; ... { C c; ... } to ensure that C's destructor is run. And of course they can be generated for other languages as well. > MUST_NOT_THROW_EXPR > What sort of code produces one of these nodes? They do not seem to be > used for the throw() specifiers for a function (At least in C++) as i > would have expected. MUST_NOT_THROW_EXPR is a C++ specific code. It is used for a few places which must not throw, like the copy constructor of a catch parameter. It is eliminated during gimplification. throw() is handled via EH_SPEC_BLOCK, which is another C++ specific code eliminated during gimplification. > EH_FILTER_EXPR > In what situations are these nodes generated? EH_FILTER_EXPR is generated when EH_SPEC_BLOCK and MUST_NOT_THROW_EXPR are gimplified. > I assume that the code > that these filters applies to is external to the node and if an > exception occurs in this external code that does not match any of the > types in the EH_FILTER_TYPES list (Do they have to be exact matches/how > is type matching done here) then it calls the EH_FILTER_FAILURE which > could be for example a call to terminate()? EH_FILTER_EXPR will be operand 2 of a TRY_CATCH_EXPR. When the body (operand 1) of the TRY_CATCH_EXPR throws an exception, then if operand 2 is EH_FILTER_EXPR, the exception is matched against EH_FILTER_TYPES. If the exception does not match, then EH_FILTER_FAILURE is called. EH_FILTER_FAILURE is normally a call to terminate() or unexpected(). > How does the EH_FILTER_MUST_NOT_THROW() macro work? It generates an exception region such that if an exception is seen there, terminate is called. (At least, I think that is how it works.) > If it returns true > then the filter allows NO exceptions and if false then allows only > exceptions of type that are in this list? Yes. > Is it possible for the > EH_FILTER_TYPES list to be empty and EH_FILTER_MUST_NOT_THROW() to > return false? Perhaps. The two cases are essentially equivalent. Ian