]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
backport: re PR fortran/61138 (Wrong code with pointer-bounds remapping)
authorMikael Morin <mikael@gcc.gnu.org>
Sat, 21 Mar 2015 15:45:13 +0000 (15:45 +0000)
committerMikael Morin <mikael@gcc.gnu.org>
Sat, 21 Mar 2015 15:45:13 +0000 (15:45 +0000)
Backport from trunk:
2015-03-14  Mikael Morin  <mikael@gcc.gnu.org>

PR fortran/61138
fortran/
* trans-expr.c (gfc_trans_pointer_assignment): Clear DESCRIPTOR_ONLY
field before reusing LSE.
testsuite/
* gfortran.dg/pointer_remapping_9.f90: New.

From-SVN: r221556

gcc/fortran/ChangeLog
gcc/fortran/trans-expr.c
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/pointer_remapping_9.f90 [new file with mode: 0644]

index 0a4a9f940342bbf10155d7f561eb33371b353a55..b055f3a0d34f9e36d16a942fc0d1c6518dd261c6 100644 (file)
@@ -1,3 +1,12 @@
+2015-03-21  Mikael Morin  <mikael@gcc.gnu.org>
+
+       Backport from trunk:
+       2015-03-14  Mikael Morin  <mikael@gcc.gnu.org>
+
+       PR fortran/61138
+       * trans-expr.c (gfc_trans_pointer_assignment): Clear DESCRIPTOR_ONLY
+       field before reusing LSE.
+
 2015-03-15  Paul Thomas  <pault@gcc.gnu.org>
 
        Backport from mainline
index 472059b0b6f96796f4df8c9b3386cca0a06ea32b..456b2ceadff3ccccfe276e42a5a1c0ab72815e9a 100644 (file)
@@ -6547,6 +6547,7 @@ gfc_trans_pointer_assignment (gfc_expr * expr1, gfc_expr * expr2)
       else if (expr2->expr_type == EXPR_VARIABLE)
        {
          /* Assign directly to the LHS's descriptor.  */
+         lse.descriptor_only = 0;
          lse.direct_byref = 1;
          gfc_conv_expr_descriptor (&lse, expr2);
          strlen_rhs = lse.string_length;
@@ -6571,7 +6572,7 @@ gfc_trans_pointer_assignment (gfc_expr * expr1, gfc_expr * expr2)
          /* Assign to a temporary descriptor and then copy that
             temporary to the pointer.  */
          tmp = gfc_create_var (TREE_TYPE (desc), "ptrtemp");
-
+         lse.descriptor_only = 0;
          lse.expr = tmp;
          lse.direct_byref = 1;
          gfc_conv_expr_descriptor (&lse, expr2);
index adf9881d79cbb171e2777c10b886738a4f8a9a97..c2630cb2e1c3a6bc2d4a6e9237f2f61027caff6e 100644 (file)
@@ -1,3 +1,8 @@
+2015-03-21  Mikael Morin  <mikael@gcc.gnu.org>
+
+       PR fortran/61138
+       * gfortran.dg/pointer_remapping_9.f90: New.
+
 2015-03-16  Eric Botcazou  <ebotcazou@adacore.com>
 
        * testsuite/g++.dg/pr65049.C: New test.
diff --git a/gcc/testsuite/gfortran.dg/pointer_remapping_9.f90 b/gcc/testsuite/gfortran.dg/pointer_remapping_9.f90
new file mode 100644 (file)
index 0000000..7c1e232
--- /dev/null
@@ -0,0 +1,31 @@
+! { dg-do run }
+!
+! PR fortran/61138
+! Wrong code with pointer-bounds remapping
+!
+! Contributed by Tobias Burnus <burnus@net-b.de>
+
+implicit none
+integer, target :: tgt(10)
+integer, target, allocatable :: tgt2(:)
+integer, pointer :: ptr(:)
+
+tgt = [1,2,3,4,5,6,7,8,9,10]
+tgt2 = [1,2,3,4,5,6,7,8,9,10]
+
+
+ptr(-5:) => tgt(5:)  ! Okay
+
+if (size(ptr) /= 6 .or. lbound(ptr,1) /= -5) call abort()
+if (any (ptr /= [5,6,7,8,9,10])) call abort()
+
+
+ptr(-5:) => tgt2(5:)  ! wrongly associates the whole array
+
+print '(*(i4))', size(ptr), lbound(ptr)
+print '(*(i4))', ptr
+
+if (size(ptr) /= 6 .or. lbound(ptr,1) /= -5) call abort()
+if (any (ptr /= [5,6,7,8,9,10])) call abort()
+end
+