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