re PR fortran/34387 (FAIL: gfortran.dg/optional_dim_2.f90: FE vs library argument...
authorJerry DeLisle <jvdelisle@gcc.gnu.org>
Sun, 6 Jan 2008 18:19:06 +0000 (18:19 +0000)
committerJerry DeLisle <jvdelisle@gcc.gnu.org>
Sun, 6 Jan 2008 18:19:06 +0000 (18:19 +0000)
2008-01-06  Jerry DeLisle  <jvdelisle@gcc.gnu.org>

PR fortran/34387
* trans-expr.c (gfc_conv_missing_dummy): Use a temporary to type convert
the dummy variable expression, test for NULL, and pass the variable
address to the called function.

From-SVN: r131356

gcc/fortran/ChangeLog
gcc/fortran/trans-expr.c

index f7b85b0673110eac514489ab0c571bf5929582c7..932527eadf8f0352575d8e037b1383ddbf4e09b7 100644 (file)
@@ -1,3 +1,10 @@
+2008-01-06  Jerry DeLisle  <jvdelisle@gcc.gnu.org>
+
+       PR fortran/34387
+       * trans-expr.c (gfc_conv_missing_dummy): Use a temporary to type convert
+       the dummy variable expression, test for NULL, and pass the variable
+       address to the called function.
+
 2007-01-06  Tobias Burnus  <burnus@net-b.de>
 
        PR fortran/34658
index 53cd7e6445030b93668f85226e5459fa19288224..65c65e35233af08a7cbbc174a3b4510895d2a8a8 100644 (file)
@@ -154,18 +154,24 @@ gfc_conv_missing_dummy (gfc_se * se, gfc_expr * arg, gfc_typespec ts, int kind)
 
   present = gfc_conv_expr_present (arg->symtree->n.sym);
 
-  tmp = build3 (COND_EXPR, TREE_TYPE (se->expr), present, se->expr,
-                 fold_convert (TREE_TYPE (se->expr), integer_zero_node));
-  tmp = gfc_evaluate_now (tmp, &se->pre);
-
   if (kind > 0)
     {
+      /* Create a temporary and convert it to the correct type.  */
       tmp = gfc_get_int_type (kind);
-      tmp = fold_convert (tmp, se->expr);
-      tmp = gfc_evaluate_now (tmp, &se->pre); 
+      tmp = fold_convert (tmp, build_fold_indirect_ref (se->expr));
+    
+      /* Test for a NULL value.  */
+      tmp = build3 (COND_EXPR, TREE_TYPE (tmp), present, tmp, integer_one_node);
+      tmp = gfc_evaluate_now (tmp, &se->pre);
+      se->expr = build_fold_addr_expr (tmp);
+    }
+  else
+    {
+      tmp = build3 (COND_EXPR, TREE_TYPE (se->expr), present, se->expr,
+                   fold_convert (TREE_TYPE (se->expr), integer_zero_node));
+      tmp = gfc_evaluate_now (tmp, &se->pre);
+      se->expr = tmp;
     }
-
-  se->expr = tmp;
 
   if (ts.type == BT_CHARACTER)
     {