This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[Patch, Fortran, committed] Minor %(l)ld fix, move td.deferred check earlier
- From: Tobias Burnus <burnus at net-b dot de>
- To: gcc patches <gcc-patches at gcc dot gnu dot org>, gfortran <fortran at gcc dot gnu dot org>
- Date: Sat, 10 Dec 2011 21:14:37 +0100
- Subject: [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