This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[Patch, Fortran] PR - fix SIGNAL intrinsic (4.6/4.7 Regression)
- From: Tobias Burnus <burnus at net-b dot de>
- To: gcc patches <gcc-patches at gcc dot gnu dot org>, gfortran <fortran at gcc dot gnu dot org>
- Date: Sat, 09 Jul 2011 20:59:08 +0200
- Subject: [Patch, Fortran] PR - fix SIGNAL intrinsic (4.6/4.7 Regression)
The regression seems to be a side effect of the -fwhole-file effort.
The BT_UNKNOWN of the second argument of SIGNAL(NUMBER,HANDLER) triggers
an ICE in trans-types.c, when generating the decl for the external
function "signal" (or rather for __gfortran_signal_func{,_int}).
As both handler == <integer expression> and handler == <subroutine
proc-pointer> are pointers, it seems to be simplest to translate the
second argument as "void *" (BT_VOID).
Build and regtested on x86-64-linux.
OK for the trunk and the 4.6 branch?
Tobias
2011-07-09 Tobias Burnus <burnus@net-b.de>
PR fortran/49690
* intrinsic.c (add_functions): Use BT_VOID for 2nd argument of SIGNAL.
2011-07-09 Tobias Burnus <burnus@net-b.de>
PR fortran/49690
* gfortran.dg/intrinsic_signal.f90: New.
diff --git a/gcc/fortran/intrinsic.c b/gcc/fortran/intrinsic.c
index a72da91..5946ddd 100644
--- a/gcc/fortran/intrinsic.c
+++ b/gcc/fortran/intrinsic.c
@@ -2594,7 +2594,7 @@ add_functions (void)
add_sym_2 ("signal", GFC_ISYM_SIGNAL, CLASS_IMPURE, ACTUAL_NO, BT_INTEGER,
di, GFC_STD_GNU, gfc_check_signal, NULL, gfc_resolve_signal,
- num, BT_INTEGER, di, REQUIRED, han, BT_UNKNOWN, 0, REQUIRED);
+ num, BT_INTEGER, di, REQUIRED, han, BT_VOID, 0, REQUIRED);
make_generic ("signal", GFC_ISYM_SIGNAL, GFC_STD_GNU);
--- /dev/null 2011-07-09 08:27:50.727884038 +0200
+++ gcc/gcc/testsuite/gfortran.dg/intrinsic_signal.f90 2011-07-09 20:19:35.000000000 +0200
@@ -0,0 +1,21 @@
+! { dg-do compile }
+!
+! PR fortran/49690
+!
+! Reduced test case, based on the one of Debian bug #631204
+!
+
+subroutine ctrlc_ast
+ common /xinterrupt/ interrupted
+ logical interrupted
+ interrupted = .true.
+end subroutine ctrlc_ast
+
+subroutine set_ctrl_c(ctrlc_ast)
+ external ctrlc_ast
+ intrinsic signal
+ integer old_handle
+ common /xinterrupt/ interrupted
+ logical interrupted
+ old_handler = signal(2, ctrlc_ast)
+end subroutine set_ctrl_c