Re: [PATCH 1 of 2] Fortran: allow character(len=*), value dummy [PR49802]

Jerry D <[email protected]> Sun, 14 Jun 2026 14:36:06 -0700
Newsgroups gmane.comp.gcc.patches,gmane.comp.gcc.fortran
Message-ID <[email protected]>
On 6/14/26 2:12 PM, Harald Anlauf wrote:
> Hi Jerry,
> 
> I did not have time for a thorough review, but here are some comments:
> 
> - thanks a lot for working on this!  This actually addresses multiple
>    PRs: 49802, 102369, 104585, 110290.

Thanks for the feedback. This one has been a beast. See responses below.

> 
> - the following invalid code is only partially detected:
> 
> ! These are invalid:
> subroutine sub9_bind (x, y) bind(c) ! invalid, detected
>    character(1), intent(in) :: x(:)
>    character(1), value      :: y(:)
> end subroutine sub9_bind
> 
> subroutine sub10_bind (x, y, n) bind(c) ! invalid, NOT detected
>    integer,      value      :: n
>    character(1), intent(in) :: x(n)
>    character(1), value      :: y(n)
> end subroutine sub10_bind
> 
> subroutine sub11_bind (x, y, n) bind(c) ! invalid, NOT detected
>    integer,      value, intent(in) :: n
>    character(1), intent(in) :: x(*)
>    character(1), value      :: y(*)
> end subroutine sub11_bind
> 
> 
> See F2018:18.3.6 for details.
> 

For the above diagnostics, can I deal with these as a followup patch?

> 
> --- a/gcc/fortran/trans-types.cc
> +++ b/gcc/fortran/trans-types.cc
> @@ -2518,6 +2518,7 @@ gfc_sym_type (gfc_symbol * sym, bool is_bind_c)
> 
>     if (sym->attr.dummy && !sym->attr.function
>         && (!sym->attr.value
> +      || sym->attr.dimension || sym->attr.codimension
>         || (sym->ts.type == BT_CHARACTER
>             && (!sym->ts.u.cl || !sym->ts.u.cl->length
>             || sym->ts.u.cl->length->expr_type != EXPR_CONSTANT)))
> 
> I don't understand the || sym->attr.codimension part.  I thought it
> is not allowed to have coarray dummies with VALUE attribute per C863.

I will check this further and fix.

> 
> BTW:
> 
> +
> +      /* F2018, C862.  Assumed-shape and explicit-shape array dummies may
> +     have the VALUE attribute, but assumed-size arrays may not.  */
> 
> It is actually C863.

Typo, I will check and fix.

> 
> For previously existing testcases: please add -std=f2003 to allow testing the 
> old behavior before the change.  This applies to
> 
> gfortran.dg/c-interop/c535a-2.f90
> gfortran.dg/value_3.f90
> 
> Furthermore, consider changing the names of the new tests from
> pr49802*.f90 to something like value*.f90.  You do not fix a bug,
> but update the compiler to a more modern standard.  People who do
> partial regression testing during development may appreciate it.

Agree, I used the pr numbers to help me not lose track. I will change all the 
test case names to be more useful.

With the above responses, OK to push after I fix and retest?

> 
> Thanks,
> Harald
> 
> 
> Am 13.06.26 um 10:27 PM schrieb Jerry D:
>> This bug has been around a long time. The attached is the first of two patches.
>>
>> Several test cases added. Some modified where restrictions changed.
>>
>> Regression tested on x86_64.
>>
>> OK for mainline?
>>
>> Regards,
>>
>> Jerry
>>
>> ---
>>
>>   Fortran: allow character(len=*), value dummy [PR49802]
>>
>> Fortran 2003 C558 prohibited assumed-length character dummies with
>> VALUE, but Fortran 2008 removed that restriction.  gfortran was still
>> rejecting it, and also rejected character dummies with VALUE whose
>> length is a non-constant specified-length expression (e.g. another
>> dummy argument).  This patch has three parts:
>>
>>    resolve.cc: Relax the constraint to allow character(len=*) with VALUE,
>>    using gfc_notify_std(GFC_STD_F2008) so -std=f2003 still rejects it.
>>    The same Fortran 2008 allowance is extended to character dummies with
>>    VALUE and a specified but non-constant length.  The C-interop checks
>>    are consolidated into a single "must have length one" condition (which
>>    also covers, and rejects, the assumed-length and non-constant-length
>>    cases since C has no equivalent), checked ahead of the Fortran 2008
>>    allowance so C-interop dummies always get the same diagnostic.
>>
>>    trans-types.cc (gfc_sym_type): Assumed-length and non-constant-length
>>    VALUE character dummies now use byref=1, giving them a pointer-based
>>    ABI consistent with the callee's VLA parameter passing.  Without this,
>>    the callee compiled as a pointer-receiving function while the caller
>>    packed bytes by value into registers, causing an ABI mismatch.
>>
>>    trans-expr.cc (conv_dummy_value): For assumed-length or non-constant-
>>    length CHARACTER VALUE dummies, generate a caller-side copy (VLA alloca
>>    + memcpy) and pass its address, so the callee operates on the copy and
>>    VALUE semantics are preserved.  This lives in conv_dummy_value, the
>>    common dummy-value conversion routine, rather than only in
>>    gfc_conv_procedure_call's argument-walking loop, so the copy is made on
>>    every path that converts a VALUE character dummy, not just direct
>>    procedure-call arguments.
>>
>> Assisted by: Claude Sonnet 4.6
>>
>>      PR fortran/49802
>>
>> gcc/fortran/ChangeLog:
>>
>>      * resolve.cc: Allow character(len=*) VALUE from Fortran 2008,
>>      and likewise a specified but non-constant length; use
>>      gfc_notify_std for F2003 compatibility, and consolidate the
>>      C-interop length checks into a single "must have length one"
>>      check (covering assumed and non-constant length too) ordered
>>      ahead of the Fortran 2008 allowance.
>>      * trans-expr.cc (conv_dummy_value): For assumed-length or
>>      non-constant-length CHARACTER VALUE dummies, make a caller-side
>>      copy via DECL_EXPR alloca and gfc_build_memcpy_call, then pass
>>      its address.
>>      * trans-types.cc (gfc_sym_type): Use byref=1 for assumed-length
>>      or non-constant-length VALUE character dummies so the ABI uses
>>      pointer passing.
>>
>> gcc/testsuite/ChangeLog:
>>
>>      * gfortran.dg/value_5.f90: Compile under -std=f2003 so the
>>      Fortran 2008 assumed-length VALUE relaxation is exercised as a
>>      rejection (foo4), and update the C-interop bar4 error
>>      expectation to match the consolidated diagnostic; the F2008
>>      acceptance case is covered separately by pr49802.f90 and
>>      pr49802_1.f90.
>>      * gfortran.dg/pr49802.f90: New test - run test for correctness
>>      with assumed-length VALUE character dummies.
>>      * gfortran.dg/pr49802_1.f90: New test - compile/error test for
>>      -std=f2003 rejection.
>>      * gfortran.dg/pr49802_2.f90: New test - run test for correctness
>>      with a non-constant specified-length VALUE character dummy.
>> ---
>