Patchwork [Fortran] PR - fix SIGNAL intrinsic (4.6/4.7 Regression)

login
register
mail settings
Submitter Tobias Burnus
Date July 9, 2011, 6:59 p.m.
Message ID <4E18A4FC.4030508@net-b.de>
Download mbox | patch
Permalink /patch/104013/
State New
Headers show

Comments

Tobias Burnus - July 9, 2011, 6:59 p.m.
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
Mikael Morin - July 10, 2011, 10:02 a.m.
On Saturday 09 July 2011 20:59:08 Tobias Burnus wrote:
> 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?
OK.

Patch

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