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. >> --- >