OSDN Git Service

2009-01-10 Paul Thomas <pault@gcc.gnu.org>
authorpault <pault@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 10 Jan 2009 00:15:37 +0000 (00:15 +0000)
committerpault <pault@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 10 Jan 2009 00:15:37 +0000 (00:15 +0000)
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.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@143238 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/fortran/ChangeLog
gcc/fortran/target-memory.c
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/transfer_null_1.f90 [new file with mode: 0644]

index b7d1b99..b3d1799 100644 (file)
@@ -1,5 +1,10 @@
 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
        * resolve.c (check_host_association): Use the symtree name to
        search for a potential contained procedure, since this is the
index 72bd6ef..dc10b53 100644 (file)
@@ -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);
index cadac67..4765a8e 100644 (file)
@@ -1,5 +1,10 @@
 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
        * gfortran.dg/host_assoc_function_6.f90: New test.
 
diff --git a/gcc/testsuite/gfortran.dg/transfer_null_1.f90 b/gcc/testsuite/gfortran.dg/transfer_null_1.f90
new file mode 100644 (file)
index 0000000..7201a68
--- /dev/null
@@ -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