This is the mail archive of the mailing list for the GCC project.

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[Bug fortran/26038] ICE on allocation of assumed length CHARACTER dummy.

------- Comment #9 from paul dot richard dot thomas at cea dot fr  2006-01-31 12:58 -------
If you look at the code produced by this final example, the 2nd argument of
_gfc_allocate is null.  This comes about because the TYPE_SIZE_UNIT that Jakub
hated me setting directly is a NULL_TREE.  I suspect that his patch will fix
this.  Otherwise, this works and will be submitted tonight:

Index: gcc/fortran/trans-stmt.c
--- gcc/fortran/trans-stmt.c    (révision 110394)
+++ gcc/fortran/trans-stmt.c    (copie de travail)
@@ -3254,8 +3254,12 @@
          val = gfc_create_var (ppvoid_type_node, "ptr");
          tmp = gfc_build_addr_expr (ppvoid_type_node, se.expr);
          gfc_add_modify_expr (&se.pre, val, tmp);
-         tmp = TYPE_SIZE_UNIT (TREE_TYPE (TREE_TYPE (se.expr)));
+         tmp = TYPE_SIZE_UNIT (TREE_TYPE (TREE_TYPE (se.expr)));
+         if (expr->ts.type == BT_CHARACTER && tmp == NULL_TREE)
+           tmp = se.string_length;
          parm = gfc_chainon_list (NULL_TREE, val);
          parm = gfc_chainon_list (parm, tmp);
          parm = gfc_chainon_list (parm, pstat);

This results in the hidden charlen dummy argument being passed to the library

Hah! I just undid the above and applied Jakub's patch; as I suspected it fixes
the bug and produces the following code:

foo (self, _self)
  bit_size_type D.802;
  <unnamed type> D.803;

  D.802 = (bit_size_type) (<unnamed type>) _self * 8;
  D.803 = (<unnamed type>) _self;
  *self = 0B;
    void * * ptr.0;

    ptr.0 = (void * *) self;
    _gfortran_allocate (ptr.0, (<unnamed type>) _self, 0);
    struct __st_parameter_dt dt_parm.1;

    dt_parm.1.common.filename = "pr26038.f90";
    dt_parm.1.common.line = 10;
    dt_parm.1.common.unit = 6;
    dt_parm.1.common.flags = 128;
    _gfortran_st_write (&dt_parm.1);
      int4 D.801;

      D.801 = _self;
      _gfortran_transfer_integer (&dt_parm.1, &D.801, 4);
    _gfortran_st_write_done (&dt_parm.1);

MAIN__ ()
  char[1:10] * q;
  char[1:5] * p;

  foo (&p, 5);
  foo (&q, 10);

I will email Jakub to let him know.  Perhaps the trick will be to apply his
pre-gomp patch to 4.2 and mine to 4.1?



Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]