This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

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


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
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

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]