* [PATCH] Fix PR88611
@ 2019-01-08 8:18 Richard Biener
2019-01-08 8:49 ` Janne Blomqvist
0 siblings, 1 reply; 2+ messages in thread
From: Richard Biener @ 2019-01-08 8:18 UTC (permalink / raw)
To: gcc-patches; +Cc: fortran
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 <rguenther@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
^ permalink raw reply [flat|nested] 2+ messages in thread
* Re: [PATCH] Fix PR88611
2019-01-08 8:18 [PATCH] Fix PR88611 Richard Biener
@ 2019-01-08 8:49 ` Janne Blomqvist
0 siblings, 0 replies; 2+ messages in thread
From: Janne Blomqvist @ 2019-01-08 8:49 UTC (permalink / raw)
To: Richard Biener; +Cc: GCC Patches, Fortran List
On Tue, Jan 8, 2019 at 10:18 AM Richard Biener <rguenther@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 <rguenther@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
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2019-01-08 8:49 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-01-08 8:18 [PATCH] Fix PR88611 Richard Biener
2019-01-08 8:49 ` Janne Blomqvist
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).