http://gcc.gnu.org/bugzilla/show_bug.cgi?id=55978
--- Comment #14 from janus at gcc dot gnu.org 2013-02-05 22:31:06 UTC --- Draft patch: Index: gcc/fortran/trans-array.c =================================================================== --- gcc/fortran/trans-array.c (revision 195644) +++ gcc/fortran/trans-array.c (working copy) @@ -7164,6 +7164,17 @@ gfc_conv_array_parameter (gfc_se * se, gfc_expr * fold_convert (TREE_TYPE (se->expr), null_pointer_node)); } + if (fsym && fsym->attr.optional && sym && sym->attr.pointer) + { + tmp = build_fold_indirect_ref_loc (input_location, desc); + tmp = gfc_conv_array_data (tmp); + tmp = fold_build2_loc (input_location, NE_EXPR, boolean_type_node, + tmp, fold_convert (TREE_TYPE (tmp), null_pointer_node)); + ptr = build3_loc (input_location, COND_EXPR, TREE_TYPE (se->expr), + tmp, fold_convert (TREE_TYPE (se->expr), ptr), + fold_convert (TREE_TYPE (se->expr), null_pointer_node)); + } + ptr = gfc_evaluate_now (ptr, &se->pre); /* Use the packed data for the actual argument, except for contiguous arrays,