Patchwork [fortran] PR 45564 ICE: type mismatch with bounds checking.

login
register
mail settings
Submitter Mikael Morin
Date Sept. 7, 2010, 1:33 p.m.
Message ID <4C863F33.2040000@sfr.fr>
Download mbox | patch
Permalink /patch/64011/
State New
Headers show

Comments

Mikael Morin - Sept. 7, 2010, 1:33 p.m.
Hello,

this is the fix for pr45564 where an expression's string length had type 
gfc_index_type_node instead of gfc_charlen_type_node, triggering an 
assert in the middle-end (on 64 bits platforms at least).

The fix is to add the conversion (second hunk in trans-intrinsic.c).

Other hunks are about cases (noticed while debugging the ICE) where we 
use integer_one_node for string length, thus hardcoding string length 
type to 32 bits integer instead of using gfc_charlen_type_node.

I plan to commit under the obvious rule once regression test finishes.

Mikael
2010-09-07  Mikael Morin  <mikael@gcc.gnu.org>

	* trans-stmt.c (gfc_trans_character_select): Be conversion-safe while
	checking string length value.
	* trans-intrinsic.c (gfc_conv_intrinsic_char): Build integer using
	gfc_charlen_type_node type.

	PR fortran/45564
	* trans-intrinsic.c (gfc_conv_intrinsic_transfer): Convert string
	length to gfc_charlen_type_node.

2010-09-07  Mikael Morin  <mikael@gcc.gnu.org>

	* gfortran.dg/achar_4.f90: Enable bounds checking.
Index: gfortran.dg/achar_4.f90
===================================================================
--- gfortran.dg/achar_4.f90	(révision 163944)
+++ gfortran.dg/achar_4.f90	(copie de travail)
@@ -1,4 +1,5 @@
 ! { dg-do run }
+! { dg-options "-fbounds-check" }
 ! Tests the fix for PR31257, in which achar caused an ICE because it had no
 ! charlen.
 !
Mikael Morin - Sept. 7, 2010, 5:18 p.m.
Le 07.09.2010 15:33, Mikael Morin a écrit :
> Hello,
>
> this is the fix for pr45564 where an expression's string length had type
> gfc_index_type_node instead of gfc_charlen_type_node, triggering an
> assert in the middle-end (on 64 bits platforms at least).
>
> The fix is to add the conversion (second hunk in trans-intrinsic.c).
>
> Other hunks are about cases (noticed while debugging the ICE) where we
> use integer_one_node for string length, thus hardcoding string length
> type to 32 bits integer instead of using gfc_charlen_type_node.
>
> I plan to commit under the obvious rule once regression test finishes.
It was revision 163958.

Patch

Index: trans-stmt.c
===================================================================
--- trans-stmt.c	(révision 163944)
+++ trans-stmt.c	(copie de travail)
@@ -1692,7 +1692,7 @@  gfc_trans_character_select (gfc_code *code)
   gfc_init_block (&body);
 
   /* Attempt to optimize length 1 selects.  */
-  if (expr1se.string_length == integer_one_node)
+  if (integer_onep (expr1se.string_length))
     {
       for (d = cp; d; d = d->right)
 	{
Index: trans-intrinsic.c
===================================================================
--- trans-intrinsic.c	(révision 163944)
+++ trans-intrinsic.c	(copie de travail)
@@ -1428,7 +1428,7 @@  gfc_conv_intrinsic_char (gfc_se * se, gfc_expr * e
   arg[0] = fold_build1_loc (input_location, NOP_EXPR, type, arg[0]);
   gfc_add_modify (&se->pre, var, arg[0]);
   se->expr = gfc_build_addr_expr (build_pointer_type (type), var);
-  se->string_length = integer_one_node;
+  se->string_length = build_int_cst (gfc_charlen_type_node, 1);
 }
 
 
@@ -4709,7 +4709,7 @@  gfc_conv_intrinsic_transfer (gfc_se * se, gfc_expr
 
   se->expr = info->descriptor;
   if (expr->ts.type == BT_CHARACTER)
-    se->string_length = dest_word_len;
+    se->string_length = fold_convert (gfc_charlen_type_node, dest_word_len);
 
   return;