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



--- Comment #17 from Tobias Burnus <burnus at gcc dot gnu.org> 2013-02-06 
11:16:38 UTC ---

(In reply to comment #16)

> For the allocatable case, no packing is done at all (I guess it's just not

> needed there, since an allocatable array, contrary to a pointer, is always

> contiguous, right?).



Good point. Also simply contiguous pointers shouldn't need packing, though, I

think that is checked before - hence, this code only reaches

non-simply-contiguous arrays.





Additionally, I think we currently add the wrong checks for (sym = DT with

pointer, optional attribute; fsym = optional):



  7159        if (fsym && fsym->attr.optional && sym && sym->attr.optional)

  7160          {

  7161            tmp = gfc_conv_expr_present (sym);



When one uses"sym%comp" as actual argument. In that case "sym" has to be

present and a non-null pointer. Thus, if "comp" is a pointer, only "sym%comp ==

NULL" needs to be checked, if "comp" isn't a pointer, no check at all is

required.





Maybe one should rename "gfc_conv_expr_present" to "gfc_conv_sym_present" - and

add a version for expressions, which can then be called for:



    if (fsym && fsym->attr.optional

        && (sym && sym->attr.optional)

           || expr->expr_type == EXPR_NULL

           || (expr->ts.type != BT_CLASS gfc_expr_attr(expr).pointer)

           || (expr->ts.type == BT_CLASS gfc_expr_attr(expr).class_pointer)))

      {

         tmp = gfc_conv_expr_present (sym);

Reply via email to