From 4aa236cd4aeb7b24624e6df1252296daf6b854f4 Mon Sep 17 00:00:00 2001 From: Mikael Morin Date: Sat, 21 Mar 2015 15:45:13 +0000 Subject: [PATCH] backport: re PR fortran/61138 (Wrong code with pointer-bounds remapping) Backport from trunk: 2015-03-14 Mikael Morin 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 | 9 ++++++ gcc/fortran/trans-expr.c | 3 +- gcc/testsuite/ChangeLog | 5 +++ .../gfortran.dg/pointer_remapping_9.f90 | 31 +++++++++++++++++++ 4 files changed, 47 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/gfortran.dg/pointer_remapping_9.f90 diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 0a4a9f940342..b055f3a0d34f 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,12 @@ +2015-03-21 Mikael Morin + + Backport from trunk: + 2015-03-14 Mikael Morin + + PR fortran/61138 + * trans-expr.c (gfc_trans_pointer_assignment): Clear DESCRIPTOR_ONLY + field before reusing LSE. + 2015-03-15 Paul Thomas Backport from mainline diff --git a/gcc/fortran/trans-expr.c b/gcc/fortran/trans-expr.c index 472059b0b6f9..456b2ceadff3 100644 --- a/gcc/fortran/trans-expr.c +++ b/gcc/fortran/trans-expr.c @@ -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); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index adf9881d79cb..c2630cb2e1c3 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2015-03-21 Mikael Morin + + PR fortran/61138 + * gfortran.dg/pointer_remapping_9.f90: New. + 2015-03-16 Eric Botcazou * 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 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 + -- 2.47.2