On Tue, Jan 8, 2019 at 10:18 AM Richard Biener <rguent...@suse.de> wrote:

>
> This is about the Fortran FE creating global variable initializers
> with wrong type (integer type rather than pointer type) for
> ISOCBINDING_NULL_* initializers.  The patch simplifies the logic
> in gfc_conv_initializer to directly create the expected GENERIC
> rather than trying to use the scalarizer.
>
> Bootstrapped and tested on x86_64-unknown-linux-gnu, ok?
>
> Thanks,
> Richard.
>
> 2019-01-08  Richard Biener  <rguent...@suse.de>
>
>         PR fortran/88611
>         * trans-expr.c (gfc_conv_initializer): For ISOCBINDING_NULL_*
>         directly build the expected GENERIC tree.
>
>         * gfortran.dg/pr88611.f90: New testcase.
>
> Index: gcc/fortran/trans-expr.c
> ===================================================================
> --- gcc/fortran/trans-expr.c    (revision 267671)
> +++ gcc/fortran/trans-expr.c    (working copy)
> @@ -7086,19 +7086,12 @@ gfc_conv_initializer (gfc_expr * expr, g
>    if (expr != NULL && expr->ts.type == BT_DERIVED
>        && expr->ts.is_iso_c && expr->ts.u.derived)
>      {
> -      gfc_symbol *derived = expr->ts.u.derived;
> -
> -      /* The derived symbol has already been converted to a (void *).  Use
> -        its kind.  */
> -      if (derived->ts.kind == 0)
> -       derived->ts.kind = gfc_default_integer_kind;
> -      expr = gfc_get_int_expr (derived->ts.kind, NULL, 0);
> -      expr->ts.f90_type = derived->ts.f90_type;
> -
> -      gfc_init_se (&se, NULL);
> -      gfc_conv_constant (&se, expr);
> -      gcc_assert (TREE_CODE (se.expr) != CONSTRUCTOR);
> -      return se.expr;
> +      if (TREE_CODE (type) == ARRAY_TYPE)
> +       return build_constructor (type, NULL);
> +      else if (POINTER_TYPE_P (type))
> +       return build_int_cst (type, 0);
> +      else
> +       gcc_unreachable ();
>      }
>
>    if (array && !procptr)
> Index: gcc/testsuite/gfortran.dg/pr88611.f90
> ===================================================================
> --- gcc/testsuite/gfortran.dg/pr88611.f90       (nonexistent)
> +++ gcc/testsuite/gfortran.dg/pr88611.f90       (working copy)
> @@ -0,0 +1,14 @@
> +! { dg-do run }
> +! { dg-options "-fdefault-integer-8 -fno-tree-forwprop -O3 -fno-tree-ccp"
> }
> +! PR 82869
> +! A temp variable of type logical was incorrectly transferred
> +! to the I/O library as a logical type of a different kind.
> +program pr82869_8
> +  use, intrinsic :: iso_c_binding
> +  type(c_ptr) :: p = c_null_ptr
> +  character(len=4) :: s
> +  write (s, *) c_associated(p), c_associated(c_null_ptr)
> +  if (s /= ' F F') then
> +     STOP 1
> +  end if
> +end program pr82869_8
>


Ok, thanks.

-- 
Janne Blomqvist

Reply via email to