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,