public inbox for fortran@gcc.gnu.org
 help / color / mirror / Atom feed
From: Mikael Morin <morin-mikael@orange.fr>
To: sgk@troutmask.apl.washington.edu, fortran@gcc.gnu.org
Subject: Re: Need a hint or more likely help
Date: Sun, 11 Feb 2024 11:56:52 +0100	[thread overview]
Message-ID: <c96a1fa3-dda8-4299-9145-82ea580ca996@orange.fr> (raw)
In-Reply-To: <ZcgqSmfPcqKXlpzQ@troutmask.apl.washington.edu>

Hello,

Le 11/02/2024 à 03:00, Steve Kargl a écrit :
> All, consider this simple code:
> 
>    module foo
>      contains
>        subroutine bar
>          character(len=:), allocatable :: s(:)
>          call bah(s)
>       end subroutine bar
>    end module foo
> 
> If one compiles with -fdump-tree-original, one see (with some pruning)
> 
>    void bar ()
>    {
>      integer(kind=8) .s;
>      struct array01_character(kind=1) s;
> 
> The above two lines seem to be ok.
> 
>      bitsizetype D.4319;
>      sizetype D.4320;
> 
>      try
>        {
>          D.4319 = (bitsizetype) (sizetype) NON_LVALUE_EXPR <.s> * 8;
>          D.4320 = (sizetype) NON_LVALUE_EXPR <.s>;
>          s.data = 0B;
>          s.dtype = {.elem_len=(unsigned long) .s, .version=0, .rank=1, .type=6};
>          bah ((character(kind=1)[0:][1:.s] * restrict) s.data, .s);
>      }
> 
> This is bad. .s is undefined.  I've trace this to trans-array.cc:11531
> 
>    if (sym->ts.type == BT_CHARACTER
>        && !INTEGER_CST_P (sym->ts.u.cl->backend_decl))
>      {
>        gfc_conv_string_length (sym->ts.u.cl, NULL, &init);
>        gfc_trans_vla_type_sizes (sym, &init);
> 
> The problem here is that sym->ts.u.cl->length == NULL.  If I change
> the conditional to
> 
>    if (sym->ts.type == BT_CHARACTER
>        && sym->ts.u.cl->length
>        && !INTEGER_CST_P (sym->ts.u.cl->backend_decl))
> 
No, I think sym->ts.u.cl->length == NULL is correct for deferred length.
It is set only when there is an expression defining the length:
     character(len=size(somevar)) :: s(:)

> then the option -fdump-tree-original produces
> 
>    void bar ()
>    {
>      integer(kind=8) .s;
>      struct array01_character(kind=1) s;
> 
>      try
>        {
>          s.data = 0B;
>          s.dtype = {.elem_len=(unsigned long) .s, .version=0, .rank=1, .type=6};
>          bah ((character(kind=1)[0:][1:.s] * restrict) s.data, .s);
>        }
> 
> which looks good except I don't know what the reference to .s here
> means.  Is this correct or should we set .s to zero by artificially
> setting sym->ts.u.cl->length to, say, zero length?
> 
Setting the variable .s to zero should be correct in any case, but it's 
not the same as setting the expression.
I think you can use
     if (sym->ts.deferred)
       gfc_add_modify (
         &init,
         sym->ts.u.cl->backend_decl,
         build_zero_cst (TREE_TYPE (sym->ts.u.cl->backen_decl))
       );
to set .s to zero.

Actually, setting to any value should be correct (including -1), as the 
value should not be used as long as the data pointer is NULL.

What is not clear is whether the values of D.4319 and D.4320  need 
update when memory is allocated for s.  I think those variables are 
referenced in the type of s (but it's not visible in the dump), and may 
need update when the value of .s changes.

I hope it helps.
Mikael

  parent reply	other threads:[~2024-02-11 10:56 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-02-11  2:00 Steve Kargl
2024-02-11  7:02 ` Steve Kargl
2024-02-11 10:56 ` Mikael Morin [this message]
2024-02-11 17:40   ` Steve Kargl
2024-02-12  3:14 ` Steve Kargl

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=c96a1fa3-dda8-4299-9145-82ea580ca996@orange.fr \
    --to=morin-mikael@orange.fr \
    --cc=fortran@gcc.gnu.org \
    --cc=sgk@troutmask.apl.washington.edu \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).