static bool decl_is_java_type (tree decl, int err) { bool r = (TYPE_PTR_P (decl) && TREE_CODE (TREE_TYPE (decl)) == RECORD_TYPE && TYPE_FOR_JAVA (TREE_TYPE (decl))); if (err) { if (TREE_CODE (decl) == REFERENCE_TYPE && TREE_CODE (TREE_TYPE (decl)) == RECORD_TYPE && TYPE_FOR_JAVA (TREE_TYPE (decl))) { /* Can't throw a reference. */ error ("type %qT is disallowed in Java %<throw%> or %<catch%>", decl); } if (r) { tree jthrow_node = IDENTIFIER_GLOBAL_VALUE (get_identifier ("jthrowable")); if (jthrow_node == NULL_TREE) fatal_error (input_location, "call to Java %<catch%> or %<throw%> with %<jthrowable%> undefined"); jthrow_node = TREE_TYPE (TREE_TYPE (jthrow_node)); if (! DERIVED_FROM_P (jthrow_node, TREE_TYPE (decl))) { /* Thrown object must be a Throwable. */ error ("type %qT is not derived from %<java::lang::Throwable%>", TREE_TYPE (decl)); } } } return r; }
static bool decl_is_java_type (tree decl, int err) { bool r = (TREE_CODE (decl) == POINTER_TYPE && TREE_CODE (TREE_TYPE (decl)) == RECORD_TYPE && TYPE_FOR_JAVA (TREE_TYPE (decl))); if (err) { if (TREE_CODE (decl) == REFERENCE_TYPE && TREE_CODE (TREE_TYPE (decl)) == RECORD_TYPE && TYPE_FOR_JAVA (TREE_TYPE (decl))) { /* Can't throw a reference. */ error ("type `%T' is disallowed in Java `throw' or `catch'", decl); } if (r) { tree jthrow_node = IDENTIFIER_GLOBAL_VALUE (get_identifier ("jthrowable")); if (jthrow_node == NULL_TREE) fatal_error ("call to Java `catch' or `throw' with `jthrowable' undefined"); jthrow_node = TREE_TYPE (TREE_TYPE (jthrow_node)); if (! DERIVED_FROM_P (jthrow_node, TREE_TYPE (decl))) { /* Thrown object must be a Throwable. */ error ("type `%T' is not derived from `java::lang::Throwable'", TREE_TYPE (decl)); } } } return r; }