[Bug fortran/33455] New: MERGE intrinsic: Check for same string lengths
burnus at gcc dot gnu dot org
gcc-bugzilla@gcc.gnu.org
Mon Sep 17 17:35:00 GMT 2007
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
More information about the Gcc-bugs
mailing list