]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR fortran/46638 (Wrong result with TRANSFER from string to DT)
authorTobias Burnus <burnus@net-b.de>
Thu, 25 Nov 2010 09:02:33 +0000 (10:02 +0100)
committerTobias Burnus <burnus@gcc.gnu.org>
Thu, 25 Nov 2010 09:02:33 +0000 (10:02 +0100)
2010-11-25  Tobias Burnus  <burnus@net-b.de>

        PR fortran/46638
        * target-memory.c (gfc_interpret_derived): Correctly handle
        component offset.

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

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

From-SVN: r167139

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 a3cf29466be677f545d5008a73547cc5ca04c5d8..9aeff4de6071a0a2e749bea02c519ebf4b06abfe 100644 (file)
@@ -1,3 +1,9 @@
+2010-11-25  Tobias Burnus  <burnus@net-b.de>
+
+       PR fortran/46638
+       * target-memory.c (gfc_interpret_derived): Correctly handle
+       component offset.
+
 2010-11-13  Tobias Burnus  <burnus@net-b.de>
 
        PR fortran/45742
index 19b24c509edc3f98d863adf0065e2ea593099928..767027b99e6cd1118de07c97dfec6a725c220aeb 100644 (file)
@@ -486,7 +486,16 @@ gfc_interpret_derived (unsigned char *buffer, size_t buffer_size, gfc_expr *resu
             }
        }
 
-      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,
                                 tail->expr);
 
index 6f0d22d1e0db1ef8a5a652a67aa1fc032743ea30..58dc4d4271202960f15fe0d1080ee8a05dafdc52 100644 (file)
@@ -1,3 +1,9 @@
+2010-11-25  Tobias Burnus  <burnus@net-b.de>
+
+       PR fortran/46638
+       * target-memory.c (gfc_interpret_derived): Correctly handle
+       component offset.
+
 2010-11-20  Eric Botcazou  <ebotcazou@adacore.com>
 
        * gcc.target/sparc/sparc-align-1.c: New test.
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