Patchwork [Fortran,committed] Minor %(l)ld fix, move td.deferred check earlier

login
register
mail settings
Submitter Tobias Burnus
Date Dec. 10, 2011, 8:14 p.m.
Message ID <4EE3BDAD.8030807@net-b.de>
Download mbox | patch
Permalink /patch/130561/
State New
Headers show

Comments

Tobias Burnus - Dec. 10, 2011, 8:14 p.m.
Hi all,

I have committed (Rev. 182190) the attached patch as obvious.

a) In one case, gfortran was using "%lld" with "long" instead of "%ld" 
(or instead of long long).

The proper data type would be something like ptrdiff_t, long long or 
similar. However, different systems require different printfs, e.g. %lld 
or %I64. Thus, we use here "%ld" with "long" even though it might be 
only 32bits instead of 64bits (on systems with 64 bit pointers). (That's 
pattern is also used in trans-arrays.c and other files.) As the value is 
used for array shapes and similar out-of-bound failures, casting a 64bit 
value to 32bit for the run-time error message is usually possible 
without information loss.

The proper solution would be to use something like 
TARGET_WIDE_INT_PRINT_DEC, which does not exist so far. (Only 
HOST_WIDE_INT_PRINT_DEC exists.)

b) Mikael had ask me to move ts.deferred up in the file, which I didn't 
do in the original commit - but which I do now with this commit. Cf. 
http://gcc.gnu.org/ml/fortran/2011-12/msg00045.html

Tobias

Patch

Index: gcc/fortran/ChangeLog
===================================================================
--- gcc/fortran/ChangeLog	(Revision 182189)
+++ gcc/fortran/ChangeLog	(Arbeitskopie)
@@ -1,3 +1,9 @@ 
+2011-12-10  Tobias Burnus  <burnus@net-b.de>
+	    Kai Tietz  <ktietz@redhat.com>
+
+	* trans-decl.c (add_argument_checking): Check ts.deferred earlier.
+	* trans-intrinsic.c (gfc_conv_intrinsic_repeat): Use %ld with long.
+
 2011-12-08  Tobias Burnus  <burnus@net-b.de>
 
 	PR fortran/50815
Index: gcc/fortran/trans-decl.c
===================================================================
--- gcc/fortran/trans-decl.c	(Revision 182189)
+++ gcc/fortran/trans-decl.c	(Arbeitskopie)
@@ -4672,7 +4672,8 @@  add_argument_checking (stmtblock_t *block, gfc_sym
   gfc_formal_arglist *formal;
 
   for (formal = sym->formal; formal; formal = formal->next)
-    if (formal->sym && formal->sym->ts.type == BT_CHARACTER)
+    if (formal->sym && formal->sym->ts.type == BT_CHARACTER
+	&& !fsym->ts.deferred)
       {
 	enum tree_code comparison;
 	tree cond;
@@ -4695,10 +4696,8 @@  add_argument_checking (stmtblock_t *block, gfc_sym
 	   if the actual argument is (part of) an array, but only if the
 	   dummy argument is an array. (See "Sequence association" in
 	   Section 12.4.1.4 for F95 and 12.4.1.5 for F2003.)  */
-	if (fsym->ts.deferred)
-	  continue;
-	else if (fsym->attr.pointer || fsym->attr.allocatable
-		 || (fsym->as && fsym->as->type == AS_ASSUMED_SHAPE))
+	if (fsym->attr.pointer || fsym->attr.allocatable
+	    || (fsym->as && fsym->as->type == AS_ASSUMED_SHAPE))
 	  {
 	    comparison = NE_EXPR;
 	    message = _("Actual string length does not match the declared one"
Index: gcc/fortran/trans-intrinsic.c
===================================================================
--- gcc/fortran/trans-intrinsic.c	(Revision 182189)
+++ gcc/fortran/trans-intrinsic.c	(Arbeitskopie)
@@ -6015,7 +6015,7 @@  gfc_conv_intrinsic_repeat (gfc_se * se, gfc_expr *
 			  build_int_cst (ncopies_type, 0));
   gfc_trans_runtime_check (true, false, cond, &se->pre, &expr->where,
 			   "Argument NCOPIES of REPEAT intrinsic is negative "
-			   "(its value is %lld)",
+			   "(its value is %ld)",
 			   fold_convert (long_integer_type_node, ncopies));
 
   /* If the source length is zero, any non negative value of NCOPIES