From 51df93ba5be0a0cbc2f38b30caf813d4bc6eece0 Mon Sep 17 00:00:00 2001 From: Paul Thomas <pault@gcc.gnu.org> Date: Sat, 10 Jan 2009 00:15:37 +0000 Subject: [PATCH] re PR fortran/38763 (TRANSFER ICE due to missing EXPR_NULL case) 2009-01-10 Paul Thomas <pault@gcc.gnu.org> PR fortran/38763 * target-memory.c (encode_derived): Encode NULL. 2009-01-10 Paul Thomas <pault@gcc.gnu.org> PR fortran/38763 * gfortran.dg/transfer_null_1.f90: New test. From-SVN: r143238 --- gcc/fortran/ChangeLog | 5 +++++ gcc/fortran/target-memory.c | 11 +++++++--- gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gfortran.dg/transfer_null_1.f90 | 20 +++++++++++++++++++ 4 files changed, 38 insertions(+), 3 deletions(-) create mode 100644 gcc/testsuite/gfortran.dg/transfer_null_1.f90 diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index b7d1b99f693a..b3d179910cca 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,8 @@ +2009-01-10 Paul Thomas <pault@gcc.gnu.org> + + PR fortran/38763 + * target-memory.c (encode_derived): Encode NULL. + 2009-01-10 Paul Thomas <pault@gcc.gnu.org> PR fortran/38765 diff --git a/gcc/fortran/target-memory.c b/gcc/fortran/target-memory.c index 72bd6eff2143..dc10b53d926e 100644 --- a/gcc/fortran/target-memory.c +++ b/gcc/fortran/target-memory.c @@ -1,5 +1,5 @@ /* Simulate storage of variables into target memory. - Copyright (C) 2007, 2008 + Copyright (C) 2007, 2008, 2009 Free Software Foundation, Inc. Contributed by Paul Thomas and Brooks Moses @@ -220,8 +220,13 @@ encode_derived (gfc_expr *source, unsigned char *buffer, size_t buffer_size) continue; ptr = TREE_INT_CST_LOW(DECL_FIELD_OFFSET(cmp->backend_decl)) + TREE_INT_CST_LOW(DECL_FIELD_BIT_OFFSET(cmp->backend_decl))/8; - gfc_target_encode_expr (ctr->expr, &buffer[ptr], - buffer_size - ptr); + + if (ctr->expr->expr_type == EXPR_NULL) + memset (&buffer[ptr], 0, + int_size_in_bytes (TREE_TYPE (cmp->backend_decl))); + else + gfc_target_encode_expr (ctr->expr, &buffer[ptr], + buffer_size - ptr); } return int_size_in_bytes (type); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index cadac67aa3b1..4765a8e8abe3 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2009-01-10 Paul Thomas <pault@gcc.gnu.org> + + PR fortran/38763 + * gfortran.dg/transfer_null_1.f90: New test. + 2009-01-10 Paul Thomas <pault@gcc.gnu.org> PR fortran/38765 diff --git a/gcc/testsuite/gfortran.dg/transfer_null_1.f90 b/gcc/testsuite/gfortran.dg/transfer_null_1.f90 new file mode 100644 index 000000000000..7201a68b38c8 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/transfer_null_1.f90 @@ -0,0 +1,20 @@ +! { dg-do compile } +! Test fix for pr38763, where NULL was not being encoded. +! +! Contributed by Steve Kargl <kargl@gcc.gnu.org> from a +! posting by James van Buskirk on clf. +! +program sizetest + use ISO_C_BINDING + implicit none + integer, parameter :: ik1 = selected_int_kind(2) + TYPE vehicle_t1 + INTEGER(C_INT), DIMENSION(:), ALLOCATABLE :: sensors + END TYPE vehicle_t1 + type(vehicle_t1) gfortran_bug_workaround + integer i + i = size(transfer(vehicle_t1(NULL()),[0_ik1])) + print *, i + i = size(transfer(vehicle_t1([i]),[0_ik1])) + print *, i +end program sizetest -- GitLab