This is the mail archive of the gcc-bugs@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[Bug fortran/55978] [4.8 Regression] class_optional_2.f90 -Os fails


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=55978

--- Comment #18 from janus at gcc dot gnu.org 2013-02-06 11:44:46 UTC ---
Here is an updated patch, which works for pointers and pointer components, uses
GFC_STD_F2008 and does some minor refactoring:

Index: gcc/fortran/trans-array.c
===================================================================
--- gcc/fortran/trans-array.c    (revision 195800)
+++ gcc/fortran/trans-array.c    (working copy)
@@ -7156,12 +7156,26 @@ gfc_conv_array_parameter (gfc_se * se, gfc_expr *
       ptr = build_call_expr_loc (input_location,
                  gfor_fndecl_in_pack, 1, desc);

-      if (fsym && fsym->attr.optional && sym && sym->attr.optional)
+      if (fsym && fsym->attr.optional)
     {
-      tmp = gfc_conv_expr_present (sym);
-      ptr = build3_loc (input_location, COND_EXPR, TREE_TYPE (se->expr),
+      if (sym && sym->attr.optional)
+        {
+          tmp = gfc_conv_expr_present (sym);
+          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));
+        }
+      else if ((gfc_option.allow_std & GFC_STD_F2008)
+           && gfc_expr_attr (expr).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);


I think this should be sufficient to fix the regression in
class_optional_2.f90. I suggest everything else should wait for 4.9. (At this
point, producing a stable release should have priority over fixing more
non-regression bugs.)

Btw, as an alternative: Wouldn't it be more reasonable to move the above check
into _gfortran_internal_pack?


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]