https://gcc.gnu.org/bugzilla/show_bug.cgi?id=110360

            Bug ID: 110360
           Summary: ABI issue with character,value dummy argument
           Product: gcc
           Version: 14.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: fortran
          Assignee: unassigned at gcc dot gnu.org
          Reporter: anlauf at gcc dot gnu.org
  Target Milestone: ---

Consider:

program p
  implicit none
  integer :: a = 65
  call val (char(65))  ! OK
  call val (char(a))   ! random junk
contains
  subroutine val (c)
    character, value :: c
    print *, "by value: ", c
  end
end

This should print twice

 by value: A
 by value: A

but the second line contains junk, as the tree-dump shows:

  static void val (character(kind=1)[1:1], integer(kind=8));
  static integer(kind=4) a = 65;

  val ("A", 1);
  {
    character(kind=1) char.1;

    char.1 = (character(kind=1)) a;
    val (&char.1, 1);
  }

Clearly, the second case is inconsistent with the ABI, see the prototype, and

https://gcc.gnu.org/onlinedocs/gfortran/Argument-passing-conventions.html

The ABI does not (yet) state how to handle character of length > 1 or variable
length - we'll likely need to pass a pointer to a temporary - but as long as
the dummy has fixed length 1 we should pass the argument by value.

A related issue occurs for actual arguments that are allocatable scalars
(or pointers to scalars).

Reply via email to