The combination of the VALUE attribute with CHARACTER(*) gives segmentation
faults (SIGSEGV, SIGBUS). Without VALUE or with "CHARACTER(10), VALUE" it
works.

------ Test case ------------
program x
  implicit none
  character(10) :: c
  c = 'Main'
  print *, c
  call foo(c)
  print *, c
contains
  subroutine foo(a)
    character(*) :: a
    value :: a
    print *, 'Foo: ',a
    a = 'Hello'
    print *, 'Foo: ',a
  end subroutine foo
end program x
------ Test case ------------

I don't know whether it can be made to work, if not, one could do something
like   Chris does in the Fortran-Experiments branch (except of only disallowing
the length "*"):

      /* Character strings are a hassle because they may be length 1,
         or assumed length (*), etc., so we need to find a way to
         prevent by-value dummy char args from being anything but
         length 1 constants, because C will only pass a pointer in
         any other cases.  However, we can't help the following with the
         logic being used below:
         character(c_char), value :: my_char
         character(kind=c_char, len=1), value :: my_char_str
         hope the user does the right thing.  */
     if (sym->attr.value == 1 && sym->ts.type == BT_CHARACTER)
       /* if we can't verify the length of 1...error */
       if (sym->ts.cl == NULL || sym->ts.cl->length == NULL
           || (sym->ts.cl->length->value.character.length != 1))
         gfc_error_now ("VALUE attribute at %L cannot be used "
                        "for character strings", &(sym->declared_at));


-- 
           Summary: "character(*), value" produces SEGV at runtime
           Product: gcc
           Version: 4.3.0
            Status: UNCONFIRMED
          Keywords: wrong-code
          Severity: normal
          Priority: P3
         Component: fortran
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: burnus at gcc dot gnu dot org


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=30783

Reply via email to