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]

Re: Re: Ping: New suggested patch for pr 62242 & pr 52332


Dear Louis,

I have just a minor nit to pick; otherwise your patch is OK for trunk.

I do not think that quoting the code in the first comment is
necessary. If anybody is interested, they can walz off to
expand_expr_real_1 themselves. The textual part of your comment is
perfectly clear.

Many thanks for the patch.

Paul

PS Do you now have all the paperwork to commit the patch yourself?

On 29 September 2015 at 09:36, Louis Krupp <louis.krupp@zoho.com> wrote:
> Paul,
>
> The patch is attached.  I last compiled and tested the code at 21:15 UTC on 28 September.
>
> Would you like me to resend the test cases?
>
> Louis
>
> ---- On Mon, 28 Sep 2015 00:55:10 -0700 Paul Richard Thomas  wrote ----
>>Hi Louis,
>>
>>Could you please send the patch as an attachment - in your message,
>>much of the lhs whitespace information has been lost. Fundamentally,
>>the patch looks OK. Since they pertain to the same PRs, I would
>>consider combining the first and third testcases, either by throwing
>>the procedures into one module of by renaming the modules; eg. gfbug1
>>and gfbug2.
>>
>>Cheers
>>
>>Paul
>>
>>On 25 September 2015 at 18:49, Louis Krupp <louis.krupp@zoho.com> wrote:
>>> Index: gcc/fortran/ChangeLog
>>> ===================================================================
>>> --- gcc/fortran/ChangeLog (revision 227895)
>>> +++ gcc/fortran/ChangeLog (working copy)
>>> @@ -1,3 +1,15 @@
>>> +2015-09-18 Louis Krupp <louis.krupp@zoho.com>
>>> +
>>> + PR fortran/62242
>>> + PR fortran/52332
>>> + * trans-array.c
>>> + (store_backend_decl): Create new gfc_charlen instance if requested
>>> + (get_array_ctor_all_strlen): Call store_backend_decl requesting
>>> + new gfc_charlen
>>> + (trans_array_constructor): Call store_backend_decl requesting
>>> + new gfc_charlen if get_array_ctor_strlen was called
>>> + (gfc_add_loop_ss_code): Don't try to convert non-constant length
>>> +
>>> 2015-09-17 Paul Thomas <pault@gcc.gnu.org>
>>>
>>> PR fortran/52846
>>> Index: gcc/testsuite/ChangeLog
>>> ===================================================================
>>> --- gcc/testsuite/ChangeLog (revision 227895)
>>> +++ gcc/testsuite/ChangeLog (working copy)
>>> @@ -1,3 +1,10 @@
>>> +2015-09-18 Louis Krupp <louis.krupp@zoho.com>
>>> +
>>> + PR fortran/62242 fortran/52332
>>> + * gfortran.dg/string_array_constructor_1.f90: New.
>>> + * gfortran.dg/string_array_constructor_2.f90: New.
>>> + * gfortran.dg/string_array_constructor_3.f90: New.
>>> +
>>> 2015-09-17 Bernd Edlinger <bernd.edlinger@hotmail.de>
>>>
>>> PR sanitizer/64078
>>> Index: gcc/fortran/trans-array.c
>>> ===================================================================
>>> --- gcc/fortran/trans-array.c (revision 227895)
>>> +++ gcc/fortran/trans-array.c (working copy)
>>> @@ -1799,6 +1799,39 @@ gfc_trans_array_constructor_value (stmtblock_t * p
>>> }
>>>
>>>
>>> +/* The array constructor code can create a string length with an operand
>>> + in the form of a temporary variable. This variable will retain its
>>> + context (current_function_decl). If we store this length tree in a
>>> + gfc_charlen structure which is shared by a variable in another
>>> + context, the resulting gfc_charlen structure with a variable in a
>>> + different context, we could trip the assertion in expand_expr_real_1
>>> + when it sees that a variable has been created in one context and
>>> + referenced in another:
>>> +
>>> + if (exp)
>>> + context = decl_function_context (exp);
>>> + gcc_assert (!exp
>>> + || SCOPE_FILE_SCOPE_P (context)
>>> + || context == current_function_decl
>>> + || TREE_STATIC (exp)
>>> + || DECL_EXTERNAL (exp)
>>> + // ??? C++ creates functions that are not TREE_STATIC.
>>> + || TREE_CODE (exp) == FUNCTION_DECL);
>>> +
>>> + If this might be the case, we create a new gfc_charlen structure and
>>> + link it into the current namespace. */
>>> +
>>> +static void
>>> +store_backend_decl (gfc_charlen **clp, tree len, bool force_new_cl)
>>> +{
>>> + if (force_new_cl)
>>> + {
>>> + gfc_charlen *new_cl = gfc_new_charlen (gfc_current_ns, *clp);
>>> + *clp = new_cl;
>>> + }
>>> + (*clp)->backend_decl = len;
>>> +}
>>> +
>>> /* A catch-all to obtain the string length for anything that is not
>>> a substring of non-constant length, a constant, array or variable. */
>>>
>>> @@ -1836,7 +1869,7 @@ get_array_ctor_all_strlen (stmtblock_t *block, gfc
>>> gfc_add_block_to_block (block, &se.pre);
>>> gfc_add_block_to_block (block, &se.post);
>>>
>>> - e->ts.u.cl->backend_decl = *len;
>>> + store_backend_decl (&e->ts.u.cl, *len, true);
>>> }
>>> }
>>>
>>> @@ -2226,6 +2259,7 @@ trans_array_constructor (gfc_ss * ss, locus * wher
>>> if (expr->ts.type == BT_CHARACTER)
>>> {
>>> bool const_string;
>>> + bool force_new_cl = false;
>>>
>>> /* get_array_ctor_strlen walks the elements of the constructor, if a
>>> typespec was given, we already know the string length and want the one
>>> @@ -2244,14 +2278,17 @@ trans_array_constructor (gfc_ss * ss, locus * wher
>>> gfc_add_block_to_block (&outer_loop->post, &length_se.post);
>>> }
>>> else
>>> - const_string = get_array_ctor_strlen (&outer_loop->pre, c,
>>> - &ss_info->string_length);
>>> + {
>>> + const_string = get_array_ctor_strlen (&outer_loop->pre, c,
>>> + &ss_info->string_length);
>>> + force_new_cl = true;
>>> + }
>>>
>>> /* Complex character array constructors should have been taken care of
>>> and not end up here. */
>>> gcc_assert (ss_info->string_length);
>>>
>>> - expr->ts.u.cl->backend_decl = ss_info->string_length;
>>> + store_backend_decl (&expr->ts.u.cl, ss_info->string_length, force_new_cl);
>>>
>>> type = gfc_get_character_type_len (expr->ts.kind, ss_info->string_length);
>>> if (const_string)
>>> @@ -2589,7 +2626,8 @@ gfc_add_loop_ss_code (gfc_loopinfo * loop, gfc_ss
>>> if (expr->ts.type == BT_CHARACTER
>>> && ss_info->string_length == NULL
>>> && expr->ts.u.cl
>>> - && expr->ts.u.cl->length)
>>> + && expr->ts.u.cl->length
>>> + && expr->ts.u.cl->length->expr_type == EXPR_CONSTANT)
>>> {
>>> gfc_init_se (&se, NULL);
>>> gfc_conv_expr_type (&se, expr->ts.u.cl->length,
>>
>>
>>
>>--
>>Outside of a dog, a book is a man's best friend. Inside of a dog it's
>>too dark to read.
>>
>>Groucho Marx
>>



-- 
Outside of a dog, a book is a man's best friend. Inside of a dog it's
too dark to read.

Groucho Marx


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