char fortran_basic_type_is_implicit_none(type_t* t) { if (t == NULL) { return 0; } else if (is_implicit_none_type(t)) { return 1; } else if (is_array_type(t)) { return fortran_basic_type_is_implicit_none(array_type_get_element_type(t)); } else if (is_function_type(t)) { return fortran_basic_type_is_implicit_none(function_type_get_return_type(t)); } else if (is_lvalue_reference_type(t)) { return fortran_basic_type_is_implicit_none(reference_type_get_referenced_type(t)); } else if (is_pointer_type(t)) { return fortran_basic_type_is_implicit_none(pointer_type_get_pointee_type(t)); } else return 0; }
type_t* fortran_update_basic_type_with_type(type_t* type_info, type_t* basic_type) { if (is_error_type(basic_type)) return basic_type; // Many functions drop the reference type, so chek it the first if (is_lvalue_reference_type(type_info)) { return get_lvalue_reference_type( fortran_update_basic_type_with_type(reference_type_get_referenced_type(type_info), basic_type)); } else if (is_pointer_type(type_info)) { return get_pointer_type( fortran_update_basic_type_with_type(pointer_type_get_pointee_type(type_info), basic_type) ); } else if (fortran_is_array_type(type_info)) { return get_array_type_bounds( fortran_update_basic_type_with_type(array_type_get_element_type(type_info), basic_type), array_type_get_array_lower_bound(type_info), array_type_get_array_upper_bound(type_info), array_type_get_array_size_expr_context(type_info)); } else if (is_function_type(type_info)) { return fortran_replace_return_type_of_function_type(type_info, basic_type); } else { return basic_type; } }
char fortran_is_scalar_type(type_t* t) { return (!is_pointer_type(t) && !is_pointer_to_member_type(t) && !is_array_type(t) && !is_lvalue_reference_type(t) && !is_rvalue_reference_type(t) && !is_function_type(t) && !is_vector_type(t)); }
char is_sound_type(type_t* t, decl_context_t decl_context) { ERROR_CONDITION(t == NULL, "Invalid NULL here", 0); if (is_array_type(t)) { type_t* element_type = array_type_get_element_type(t); if (is_void_type(element_type) || is_lvalue_reference_type(element_type) || is_function_type(element_type)) { DEBUG_CODE() { fprintf(stderr, "TYPEORDER: Deduced type is not sound because it is an array of void/references/functions\n"); } return 0; }
bool Type::is_lvalue_reference() const { return (is_lvalue_reference_type(_type_info)); }
bool Type::is_any_reference() const { return (is_lvalue_reference_type(_type_info) || is_rvalue_reference_type(_type_info) || is_rebindable_reference()); }