OSDN Git Service

2010-11-24 Tobias Burnus <burnus@net-b.de>
authorburnus <burnus@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 24 Nov 2010 16:42:06 +0000 (16:42 +0000)
committerburnus <burnus@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 24 Nov 2010 16:42:06 +0000 (16:42 +0000)
        PR fortran/46638
        * target-memory.c (gfc_interpret_derived): Correctly handle
        component offset.

2010-11-24  Tobias Burnus  <burnus@net-b.de>

        PR fortran/46638
        * gfortran.dg/transfer_simplify_10.f90: New.

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

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

index 3e45ece..adf75f8 100644 (file)
@@ -1,3 +1,9 @@
+2010-11-24  Tobias Burnus  <burnus@net-b.de>
+
+       PR fortran/46638
+       * target-memory.c (gfc_interpret_derived): Correctly handle
+       component offset.
+
 2010-11-23  Tobias Burnus  <burnus@net-b.de>
 
        PR fortran/46545
index 93e1c8c..01383c7 100644 (file)
@@ -477,7 +477,16 @@ gfc_interpret_derived (unsigned char *buffer, size_t buffer_size, gfc_expr *resu
       /* The constructor points to the component.  */
       c->n.component = cmp;
 
-      ptr = TREE_INT_CST_LOW (DECL_FIELD_OFFSET (cmp->backend_decl));
+      /* Calculate the offset, which consists of the the FIELD_OFFSET in
+        bytes, which appears in multiples of DECL_OFFSET_ALIGN-bit-sized,
+        and additional bits of FIELD_BIT_OFFSET. The code assumes that all
+        sizes of the components are multiples of BITS_PER_UNIT,
+        i.e. there are, e.g., no bit fields.  */
+
+      ptr = TREE_INT_CST_LOW (DECL_FIELD_BIT_OFFSET (cmp->backend_decl));
+      gcc_assert (ptr % 8 == 0);
+      ptr = ptr/8 + TREE_INT_CST_LOW (DECL_FIELD_OFFSET (cmp->backend_decl));
+
       gfc_target_interpret_expr (&buffer[ptr], buffer_size - ptr, e);
     }
     
index 9bbbdcb..b4fe8ba 100644 (file)
@@ -1,3 +1,8 @@
+2010-11-24  Tobias Burnus  <burnus@net-b.de>
+
+       PR fortran/46638
+       * gfortran.dg/transfer_simplify_10.f90: New.
+
 2010-11-24  Jakub Jelinek  <jakub@redhat.com>
 
        PR middle-end/46629
diff --git a/gcc/testsuite/gfortran.dg/transfer_simplify_10.f90 b/gcc/testsuite/gfortran.dg/transfer_simplify_10.f90
new file mode 100644 (file)
index 0000000..d0c83b5
--- /dev/null
@@ -0,0 +1,28 @@
+! { dg-do run }
+!
+! PR fortran/46638
+!
+! Contributed by James Van Buskirk
+!
+program test5
+   use ISO_C_BINDING
+   implicit none
+   type, bind(C) :: CPUID_type
+      integer(C_INT32_T) eax
+      integer(C_INT32_T) ebx
+      integer(C_INT32_T) edx
+      integer(C_INT32_T) ecx
+      integer(C_INT32_T) bbb
+   end type CPUID_type
+   type(CPUID_TYPE) result
+  result = transfer(achar(10)//achar(0)//achar(0)//achar(0)//'GenuineIntel'//'abcd',result)
+
+  if (     int(z'0000000A') /= result%eax  &
+      .or. int(z'756E6547') /= result%ebx  &
+      .or. int(z'49656E69') /= result%edx  &
+      .or. int(z'6C65746E') /= result%ecx  &
+      .or. int(z'64636261') /= result%bbb) then
+    write(*,'(5(z8.8:1x))') result
+    call abort()
+  end if
+end program test5