Patchwork [Fortran,committed] Fix PR 50004

login
register
mail settings
Submitter Thomas Koenig
Date Aug. 6, 2011, 3:26 p.m.
Message ID <4E3D5D26.5030904@netcologne.de>
Download mbox | patch
Permalink /patch/108788/
State New
Headers show

Comments

Thomas Koenig - Aug. 6, 2011, 3:26 p.m.
Hello world,

I have committed the attached patch as obvious after regression-testing.

The problem was that gfc_typenode_for_spec was clobbering the typespec 
for the ISO C types by converting them to integer.

Don't know why I hadn't seen this before.

Regards

	Thomas

2011-08-06  Thomas Koenig  <tkoenig@gcc.gnu.org>

         PR fortran/50004
         * target-memory.c (gfc_target_expr-size): Don't clobber typespec
         for derived types.
         * simplify.c (gfc_simplify_transfer): Don't calculate source_size
         twice.

Patch

Index: target-memory.c
===================================================================
--- target-memory.c	(Revision 177487)
+++ target-memory.c	(Arbeitskopie)
@@ -120,8 +120,14 @@  gfc_target_expr_size (gfc_expr *e)
     case BT_HOLLERITH:
       return e->representation.length;
     case BT_DERIVED:
-      type = gfc_typenode_for_spec (&e->ts);
-      return int_size_in_bytes (type);
+      {
+	/* Determine type size without clobbering the typespec for ISO C
+	   binding types.  */
+	gfc_typespec ts;
+	ts = e->ts;
+	type = gfc_typenode_for_spec (&ts);
+	return int_size_in_bytes (type);
+      }
     default:
       gfc_internal_error ("Invalid expression in gfc_target_expr_size.");
       return 0;
Index: simplify.c
===================================================================
--- simplify.c	(Revision 177487)
+++ simplify.c	(Arbeitskopie)
@@ -6048,8 +6048,6 @@  gfc_simplify_transfer (gfc_expr *source, gfc_expr
       && gfc_array_size (source, &tmp) == FAILURE)
     gfc_internal_error ("Failure getting length of a constant array.");
 
-  source_size = gfc_target_expr_size (source);
-
   /* Create an empty new expression with the appropriate characteristics.  */
   result = gfc_get_constant_expr (mold->ts.type, mold->ts.kind,
 				  &source->where);