Ping: Re: [Patch, fortran] PR24813 - ICE with scalarization LEN of character types
Paul Thomas
paulthomas2@wanadoo.fr
Sat May 6 13:48:00 GMT 2006
Paul Thomas wrote:
> :ADDPATCH fortran:
>
> This patch fixes PR24813 in which an ICE in trans-expr.c
> (gfc_conv_array_constructor_expr) would follow the attempted use of an
> array constructor as an argument for the intrinsic function LEN. This
> arose for the lack of any of the parathenalia of the scalarizer; in
> particular a gfc_ss. Rather than go to the trouble of building a loop
> in order to obtain a string length, we instead use one of the array
> constructor helper functions to obtain it directly.
>
> Regtested on Cygwin_NT/Athlon_M
>
> OK for trunk and 4.1?
>
> Paul
>
> 2006-04-23 Paul Thomas <pault@gcc.gnu.org>
>
> PR fortran/24813
> * trans-array.c (get_array_ctor_strlen): Remove static attribute.
> * trans.h: Add prototype for get_array_ctor_strlen.
> * trans-intrinsic.c (gfc_conv_intrinsic_len): Switch on EXPR_ARRAY
> and call get_array_ctor_strlen.
>
> 2006-04-23 Paul Thomas <pault@gcc.gnu.org>
>
> PR fortran/24813
> * gfortran.dg/char_cons_len_1.f90: New test.
>
>------------------------------------------------------------------------
>
>Index: gcc/fortran/trans-array.c
>===================================================================
>--- gcc/fortran/trans-array.c (révision 113192)
>+++ gcc/fortran/trans-array.c (copie de travail)
>@@ -1328,7 +1328,7 @@
> /* Figure out the string length of a character array constructor.
> Returns TRUE if all elements are character constants. */
>
>-static bool
>+bool
> get_array_ctor_strlen (gfc_constructor * c, tree * len)
> {
> bool is_const;
>Index: gcc/fortran/trans.h
>===================================================================
>--- gcc/fortran/trans.h (révision 113192)
>+++ gcc/fortran/trans.h (copie de travail)
>@@ -419,6 +419,9 @@
> extern GTY(()) tree gfc_static_ctors;
> void gfc_generate_constructors (void);
>
>+/* Get the string length of an array constructor. */
>+bool get_array_ctor_strlen (gfc_constructor *, tree *);
>+
> /* Generate a runtime error check. */
> void gfc_trans_runtime_check (tree, tree, stmtblock_t *);
>
>Index: gcc/fortran/trans-intrinsic.c
>===================================================================
>--- gcc/fortran/trans-intrinsic.c (révision 113192)
>+++ gcc/fortran/trans-intrinsic.c (copie de travail)
>@@ -2258,6 +2258,13 @@
> len = build_int_cst (NULL_TREE, arg->value.character.length);
> break;
>
>+ case EXPR_ARRAY:
>+ /* Obtain the string length from the function used by
>+ trans-array.c(gfc_trans_array_constructor). */
>+ len = NULL_TREE;
>+ get_array_ctor_strlen (arg->value.constructor, &len);
>+ break;
>+
> default:
> if (arg->expr_type == EXPR_VARIABLE
> && (arg->ref == NULL || (arg->ref->next == NULL
>
>
>------------------------------------------------------------------------
>
>! { dg-do compile }
>! Tests the fix for PR24813 in which a character array
>! constructor, as an argument for LEN, would cause an ICE.
>!
> character(11) :: chr1, chr2
> i = len ((/chr1, chr2, "ggg"/))
> j = len ((/"abcdefghijk", chr1, chr2/))
> k = len ((/'hello ','goodbye'/))
> l = foo ("yes siree, Bob")
> if (any ((/11,11,7,14/) /= (/i,j,k,l/))) call abort ()
>contains
> integer function foo (arg)
> character(*) :: arg
> character(len(arg)) :: ctor
> foo = len ((/ctor/))
> end function foo
>end
>
More information about the Gcc-patches
mailing list