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

            Bug ID: 107266
           Summary: Reject kind=4 characters for BIND(C) – it invalid and
                    generates wrong code
           Product: gcc
           Version: 13.0
            Status: UNCONFIRMED
          Keywords: accepts-invalid, wrong-code
          Severity: normal
          Priority: P3
         Component: fortran
          Assignee: unassigned at gcc dot gnu.org
          Reporter: burnus at gcc dot gnu.org
  Target Milestone: ---

There is code which expects that CHARACTER arguments inside BIND(C) procedures
is kind=1 (alias C_CHAR):

  if (sym->ts.type == BT_CHARACTER
      && ((sym->attr.function && sym->attr.is_bind_c)
          || ((sym->attr.result || sym->attr.value)
              && sym->ns->proc_name
              && sym->ns->proc_name->attr.is_bind_c)
          || (sym->ts.deferred && (!sym->ts.u.cl
                                   || !sym->ts.u.cl->backend_decl))))
    type = gfc_character1_type_node;
  else
    type = gfc_typenode_for_spec (&sym->ts, sym->attr.codimension);

If one now tries to use:

call foo(4_'abcd')
contains
subroutine foo(x)
  character(kind=4,len=4) :: x
  ...
end
end

this creates inconsistent interfaces!

Alternatively, if we want to support it, we need to change how this is handled
to yield proper code!

Reply via email to