https://gcc.gnu.org/bugzilla/show_bug.cgi?id=104819
--- Comment #13 from anlauf at gcc dot gnu.org ---
Returning to this PR, I found that passing NULL() to character pointer dummies
exhibits a wrong translation of the function call, despite the declaration
appearing fine:
program p
implicit none
character(10), pointer :: c => NULL()
character(:), pointer :: d => NULL()
! these are incorrectly translated and may crash at runtime:
call foo (null(c))
call bla (null(c))
call bar (null(d))
call bla (null())
call bar (null())
! correctly translated function calls:
call foo (c)
call bla (c)
call bar (d)
contains
subroutine foo (x)
character(len=*), pointer, intent(in) :: x
if (associated (x)) stop 1
end
subroutine bla (x)
character(len=10), pointer, intent(in) :: x
if (associated (x)) stop 2
end
subroutine bar (x)
character(len=:), pointer, intent(in) :: x
if (associated (x)) stop 3
end
end
The dump of the relevant part of the main is:
void p ()
{
static void bar (character(kind=1) * &, integer(kind=8) *);
static void bla (character(kind=1)[1:10] * &, integer(kind=8));
static void foo (character(kind=1)[1:] * &, integer(kind=8));
static character(kind=1)[1:10] * c = 0B;
static integer(kind=8) _F.d;
static character(kind=1) * d = 0B;
foo (0B);
bla (0B);
bar (0B);
{
static void * C.4802 = 0B;
bla (&C.4802);
}
{
static void * C.4803 = 0B;
bar (&C.4803);
}
foo (&c, 10);
bla (&c, 10);
bar (&d, &_F.d);
}