From: Mikael Morin Date: Sat, 21 Mar 2015 15:15:19 +0000 (+0000) Subject: re PR fortran/61138 (Wrong code with pointer-bounds remapping) X-Git-Tag: releases/gcc-4.9.3~261 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=cba0b65c2142a0faf79dd8803b78caed7e34234e;p=thirdparty%2Fgcc.git re PR fortran/61138 (Wrong code with pointer-bounds remapping) 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: r221555 --- diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index f762bb93cacf..10cba1aba1a9 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,4 +1,10 @@ -2014-03-19 Paul Thomas +2015-03-21 Mikael Morin + + PR fortran/61138 + * trans-expr.c (gfc_trans_pointer_assignment): Clear DESCRIPTOR_ONLY + field before reusing LSE. + +2015-03-19 Paul Thomas Backport from mainline PR fortran/59198 diff --git a/gcc/fortran/trans-expr.c b/gcc/fortran/trans-expr.c index 098bfdfec5b7..a093445bb149 100644 --- a/gcc/fortran/trans-expr.c +++ b/gcc/fortran/trans-expr.c @@ -6663,6 +6663,7 @@ gfc_trans_pointer_assignment (gfc_expr * expr1, gfc_expr * expr2) bound, bound, 0, GFC_ARRAY_POINTER_CONT, false); tmp = gfc_create_var (tmp, "ptrtemp"); + lse.descriptor_only = 0; lse.expr = tmp; lse.direct_byref = 1; gfc_conv_expr_descriptor (&lse, expr2); @@ -6678,6 +6679,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; @@ -6728,6 +6730,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); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 31de6375b9c9..a1f17bd302fe 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,4 +1,9 @@ -2014-03-19 Paul Thomas +2015-03-21 Mikael Morin + + PR fortran/61138 + * gfortran.dg/pointer_remapping_9.f90: New. + +2015-03-19 Paul Thomas Backport from mainline PR fortran/59198 diff --git a/gcc/testsuite/gfortran.dg/pointer_remapping_9.f90 b/gcc/testsuite/gfortran.dg/pointer_remapping_9.f90 new file mode 100644 index 000000000000..7c1e2320b4b3 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/pointer_remapping_9.f90 @@ -0,0 +1,31 @@ +! { dg-do run } +! +! PR fortran/61138 +! Wrong code with pointer-bounds remapping +! +! Contributed by Tobias Burnus + +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 +