OSDN Git Service

2010-10-20 Jerry DeLisle <jvdelisle@gcc.gnu.org>
authorjvdelisle <jvdelisle@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 21 Oct 2010 00:45:15 +0000 (00:45 +0000)
committerjvdelisle <jvdelisle@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 21 Oct 2010 00:45:15 +0000 (00:45 +0000)
PR libgfortran/46079
* runtime/stop.c (stop_numeric_f08): New function.
(stop_numeric): Restore to previous behavior.
* gfortran.map: Add symbol _gfortran_stop_numeric_f08.

2010-10-20  Jerry DeLisle  <jvdelisle@gcc.gnu.org>

PR fortran/46079
* trans_stmt.c (gfc_trans_stop): Fix whitespace.  Build a call to new
F08 numeric stop function.
* trans.h: Add declaration for gfor_fndecl_stop_numeric_f08.
* trans-decl.c (gfc_build_builtin_function_decls): Build declaration
for stop_numeric_f08.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@165746 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/fortran/ChangeLog
gcc/fortran/trans-decl.c
gcc/fortran/trans-stmt.c
gcc/fortran/trans.h
libgfortran/ChangeLog
libgfortran/gfortran.map
libgfortran/runtime/stop.c

index 43360d8..1e10747 100644 (file)
@@ -1,3 +1,12 @@
+2010-10-20  Jerry DeLisle  <jvdelisle@gcc.gnu.org>
+
+       PR fortran/46079
+       * trans_stmt.c (gfc_trans_stop): Fix whitespace.  Build a call to new
+       F08 numeric stop function.
+       * trans.h: Add declaration for gfor_fndecl_stop_numeric_f08.
+       * trans-decl.c (gfc_build_builtin_function_decls): Build declaration
+       for stop_numeric_f08.
+
 2010-10-18  Jerry DeLisle  <jvdelisle@gcc.gnu.org>
 
        * gfortran.h: Remove definition of bt enumerator.
index 2356792..f2905cd 100644 (file)
@@ -87,6 +87,7 @@ tree gfc_static_ctors;
 tree gfor_fndecl_pause_numeric;
 tree gfor_fndecl_pause_string;
 tree gfor_fndecl_stop_numeric;
+tree gfor_fndecl_stop_numeric_f08;
 tree gfor_fndecl_stop_string;
 tree gfor_fndecl_error_stop_numeric;
 tree gfor_fndecl_error_stop_string;
@@ -2802,6 +2803,12 @@ gfc_build_builtin_function_decls (void)
   /* STOP doesn't return.  */
   TREE_THIS_VOLATILE (gfor_fndecl_stop_numeric) = 1;
 
+  gfor_fndecl_stop_numeric_f08 = gfc_build_library_function_decl (
+       get_identifier (PREFIX("stop_numeric_f08")),
+       void_type_node, 1, gfc_int4_type_node);
+  /* STOP doesn't return.  */
+  TREE_THIS_VOLATILE (gfor_fndecl_stop_numeric_f08) = 1;
+
   gfor_fndecl_stop_string = gfc_build_library_function_decl_with_spec (
        get_identifier (PREFIX("stop_string")), ".R.",
        void_type_node, 2, pchar_type_node, gfc_int4_type_node);
index 31b0732..6e1a20b 100644 (file)
@@ -602,25 +602,25 @@ gfc_trans_stop (gfc_code *code, bool error_stop)
     {
       tmp = build_int_cst (gfc_int4_type_node, 0);
       tmp = build_call_expr_loc (input_location,
-                                error_stop ? gfor_fndecl_error_stop_string
+                                error_stop ? gfor_fndecl_error_stop_string
                                 : gfor_fndecl_stop_string,
-                                2, build_int_cst (pchar_type_node, 0), tmp);
+                                2, build_int_cst (pchar_type_node, 0), tmp);
     }
   else if (code->expr1->ts.type == BT_INTEGER)
     {
       gfc_conv_expr (&se, code->expr1);
       tmp = build_call_expr_loc (input_location,
-                                error_stop ? gfor_fndecl_error_stop_numeric
-                                : gfor_fndecl_stop_numeric, 1,
+                                error_stop ? gfor_fndecl_error_stop_numeric
+                                : gfor_fndecl_stop_numeric_f08, 1, 
                                 fold_convert (gfc_int4_type_node, se.expr));
     }
   else
     {
       gfc_conv_expr_reference (&se, code->expr1);
       tmp = build_call_expr_loc (input_location,
-                                error_stop ? gfor_fndecl_error_stop_string
+                                error_stop ? gfor_fndecl_error_stop_string
                                 : gfor_fndecl_stop_string,
-                                2, se.expr, se.string_length);
+                                2, se.expr, se.string_length);
     }
 
   gfc_add_expr_to_block (&se.pre, tmp);
index d4c54c0..efd5eb9 100644 (file)
@@ -589,6 +589,7 @@ void gfc_omp_firstprivatize_type_sizes (struct gimplify_omp_ctx *, tree);
 extern GTY(()) tree gfor_fndecl_pause_numeric;
 extern GTY(()) tree gfor_fndecl_pause_string;
 extern GTY(()) tree gfor_fndecl_stop_numeric;
+extern GTY(()) tree gfor_fndecl_stop_numeric_f08;
 extern GTY(()) tree gfor_fndecl_stop_string;
 extern GTY(()) tree gfor_fndecl_error_stop_numeric;
 extern GTY(()) tree gfor_fndecl_error_stop_string;
index 58a7a93..c47cac3 100644 (file)
@@ -1,3 +1,10 @@
+2010-10-20  Jerry DeLisle  <jvdelisle@gcc.gnu.org>
+
+       PR libgfortran/46079
+       * runtime/stop.c (stop_numeric_f08): New function.
+       (stop_numeric): Restore to previous behavior.
+       * gfortran.map: Add symbol _gfortran_stop_numeric_f08.
+
 2010-10-18  Jerry DeLisle  <jvdelisle@gcc.gnu.org>
 
        * io/io.h: Remove definition of the BT enumerator.
index c85ebf7..b5fad17 100644 (file)
@@ -1141,6 +1141,7 @@ GFORTRAN_1.4 {
     _gfortran_parity_l8;
     _gfortran_parity_l16;
     _gfortran_selected_real_kind2008;
+    _gfortran_stop_numeric_f08;
     _gfortran_transfer_array_write;
     _gfortran_transfer_character_write;
     _gfortran_transfer_character_wide_write;
index f2a1233..29f5031 100644 (file)
@@ -35,10 +35,29 @@ export_proto(stop_numeric);
 void
 stop_numeric (GFC_INTEGER_4 code)
 {
+  if (code == -1)
+    code = 0;
+  else
+    st_printf ("STOP %d\n", (int)code);
+
+  sys_exit (code);
+}
+
+
+/* A Fortran 2008 numeric STOP statement.  */
+
+extern void stop_numeric_f08 (GFC_INTEGER_4)
+  __attribute__ ((noreturn));
+export_proto(stop_numeric_f08);
+
+void
+stop_numeric_f08 (GFC_INTEGER_4 code)
+{
   st_printf ("STOP %d\n", (int)code);
   sys_exit (code);
 }
 
+
 /* A character string or blank STOP statement.  */
 
 void
@@ -75,7 +94,8 @@ error_stop_string (const char *string, GFC_INTEGER_4 len)
   sys_exit (1);
 }
 
-/* A numeric or blank ERROR STOP statement.  */
+
+/* A numeric ERROR STOP statement.  */
 
 extern void error_stop_numeric (GFC_INTEGER_4)
   __attribute__ ((noreturn));