trans.c (gfc_allocate_allocatable): Revert accidental commit.
authorThomas Koenig <tkoenig@gcc.gnu.org>
Sat, 27 Oct 2012 12:07:26 +0000 (12:07 +0000)
committerThomas Koenig <tkoenig@gcc.gnu.org>
Sat, 27 Oct 2012 12:07:26 +0000 (12:07 +0000)
2012-10-27  Thomas Koenig  <tkoenig@gcc.gnu.org>

* trans.c (gfc_allocate_allocatable):  Revert accidental
commit.

From-SVN: r192875

gcc/fortran/ChangeLog
gcc/fortran/trans.c

index 25928e18c38dc48eb5fa8b5ec6eb11f5a8ab7a9b..25e5f0b2716d0971cec49c55924ef774a7c16ae3 100644 (file)
@@ -1,3 +1,8 @@
+2012-10-27  Thomas Koenig  <tkoenig@gcc.gnu.org>
+
+       * trans.c (gfc_allocate_allocatable):  Revert accidental
+       commit.
+
 2012-10-24  Janus Weil  <janus@gcc.gnu.org>
 
        PR fortran/55037
index 7c2d47250d4d6eaa2beb91b84417e14e020757c8..6365213b8f063682ef51e479d4a62ca3ac8b07b7 100644 (file)
@@ -814,23 +814,26 @@ gfc_allocate_allocatable (stmtblock_t * block, tree mem, tree size, tree token,
 }
 
 
-/* Free a given variable.  If it is NULL, free takes care of this
-   automatically.  */
+/* Free a given variable, if it's not NULL.  */
 tree
 gfc_call_free (tree var)
 {
   stmtblock_t block;
-  tree call;
+  tree tmp, cond, call;
 
   if (TREE_TYPE (var) != TREE_TYPE (pvoid_type_node))
     var = fold_convert (pvoid_type_node, var);
 
   gfc_start_block (&block);
   var = gfc_evaluate_now (var, &block);
+  cond = fold_build2_loc (input_location, NE_EXPR, boolean_type_node, var,
+                         build_int_cst (pvoid_type_node, 0));
   call = build_call_expr_loc (input_location,
                              builtin_decl_explicit (BUILT_IN_FREE),
                              1, var);
-  gfc_add_expr_to_block (&block, call);
+  tmp = fold_build3_loc (input_location, COND_EXPR, void_type_node, cond, call,
+                        build_empty_stmt (input_location));
+  gfc_add_expr_to_block (&block, tmp);
 
   return gfc_finish_block (&block);
 }
@@ -858,10 +861,11 @@ gfc_call_free (tree var)
        }
     }
 
-   In this front-end version, status doesn't have to be GFC_INTEGER_4.  If
-   CAN_FAIL is true, no status variable is passed and we are not dealing with
-   a coarray, we will simply call free().  This is used for unconditional
-   deallocation generated by the front-end at end of each procedure.
+   In this front-end version, status doesn't have to be GFC_INTEGER_4.
+   Moreover, if CAN_FAIL is true, then we will not emit a runtime error,
+   even when no status variable is passed to us (this is used for
+   unconditional deallocation generated by the front-end at end of
+   each procedure).
    
    If a runtime-message is possible, `expr' must point to the original
    expression being deallocated for its locus and variable name.
@@ -886,14 +890,6 @@ gfc_deallocate_with_status (tree pointer, tree status, tree errmsg,
       STRIP_NOPS (pointer);
     }
 
-  else if (can_fail && status == NULL_TREE)
-    {
-      tmp = build_call_expr_loc (input_location,
-                                builtin_decl_explicit (BUILT_IN_FREE), 1,
-                                fold_convert (pvoid_type_node, pointer));
-      return tmp;
-    }
-
   cond = fold_build2_loc (input_location, EQ_EXPR, boolean_type_node, pointer,
                          build_int_cst (TREE_TYPE (pointer), 0));