This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug fortran/33455] New: MERGE intrinsic: Check for same string lengths
- From: "burnus at gcc dot gnu dot org" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: 17 Sep 2007 17:35:12 -0000
- Subject: [Bug fortran/33455] New: MERGE intrinsic: Check for same string lengths
- Reply-to: gcc-bugzilla at gcc dot gnu dot org
See 31610 for another example.
"13.7.75 MERGE (TSOURCE, FSOURCE, MASK)"
"FSOURCE shall be of the same type and type parameters as TSOURCE."
NAG f95:
Error: merge_char_3.f90, line 4: Unequal character lengths (2 and 3) in MERGE
intrinsic
Error: merge_char_3.f90, line 5: Unequal character lengths (2 and 3) in MERGE
intrinsic
implicit none
character(len=2) :: a
character(len=3) :: b
print *, merge(a,b,.true.) ! { dg-error "Unequal character lengths" }
print *, merge('aa','bbb',.true.) ! { dg-error "Unequal character lengths" }
end
First version of a patch follows. However, it does not detect the second
transfer as for 'aa' expr->ts.cl->length etc. is not set, but only
expr->value.character.length (cf. match_string_constant). (Note: setting cl.*
in
match_string_constant does not completely work: In
gfortran.dg/char_length_1.f90 the warning for line 12 and 14 is then
suppressed.)
Index: check.c
===================================================================
--- check.c (Revision 128550)
+++ check.c (Arbeitskopie)
@@ -1820,6 +1820,23 @@
if (same_type_check (tsource, 0, fsource, 1) == FAILURE)
return FAILURE;
+ /* In case of characters, the string lengths need to match. */
+ if (tsource->ts.type == BT_CHARACTER && tsource->ts.cl
+ && tsource->ts.cl->length && fsource->ts.cl && fsource->ts.cl->length
+ && tsource->ts.cl->length->expr_type == EXPR_CONSTANT
+ && fsource->ts.cl->length->expr_type == EXPR_CONSTANT
+ && mpz_cmp (tsource->ts.cl->length->value.integer,
+ fsource->ts.cl->length->value.integer) != 0)
+ {
+ gfc_error ("Unequal character lengths (%ld and %ld) in MERGE "
+ "intrinsic at %L",
+ mpz_get_si (tsource->ts.cl->length->value.integer),
+ mpz_get_si (fsource->ts.cl->length->value.integer),
+ &tsource->where);
+ return FAILURE;
+ }
+
+
if (type_check (mask, 2, BT_LOGICAL) == FAILURE)
return FAILURE;
In case some one is interested in the match_string_constant change (which
causes the warn regression), here it comes:
Index: primary.c
===================================================================
--- primary.c (Revision 128550)
+++ primary.c (Arbeitskopie)
@@ -946,6 +946,8 @@ got_delim:
e->value.character.string = p = gfc_getmem (length + 1);
e->value.character.length = length;
+ e->ts.cl = gfc_get_charlen ();
+ e->ts.cl->length = gfc_int_expr (length);
gfc_current_locus = start_locus;
gfc_next_char (); /* Skip delimiter */
--
Summary: MERGE intrinsic: Check for same string lengths
Product: gcc
Version: 4.3.0
Status: UNCONFIRMED
Keywords: accepts-invalid
Severity: normal
Priority: P3
Component: fortran
AssignedTo: unassigned at gcc dot gnu dot org
ReportedBy: burnus at gcc dot gnu dot org
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=33455