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

mail settings
Submitter Tobias Burnus
Date Dec. 10, 2011, 8:14 p.m.
Message ID <>
Download mbox | patch
Permalink /patch/130561/
State New
Headers show


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 

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.



Index: gcc/fortran/ChangeLog
--- gcc/fortran/ChangeLog	(Revision 182189)
+++ gcc/fortran/ChangeLog	(Arbeitskopie)
@@ -1,3 +1,9 @@ 
+2011-12-10  Tobias Burnus  <>
+	    Kai Tietz  <>
+	* 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  <>
 	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 for F95 and 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