summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorburnus <burnus@138bc75d-0d04-0410-961f-82ee72b054a4>2016-06-20 18:46:43 +0000
committerburnus <burnus@138bc75d-0d04-0410-961f-82ee72b054a4>2016-06-20 18:46:43 +0000
commita40b4b62b4cf2edbd36e1876067af01d8b6d9320 (patch)
treef432ca0d97710e877f4c63d285bc0783b10bcbf7
parentecbea05a82f27e54e4cc17a60a456fed58c51631 (diff)
downloadgcc-a40b4b62b4cf2edbd36e1876067af01d8b6d9320.tar.gz
2016-06-20 Tobias Burnus <burnus@net-b.de>
fortran/71194 * trans-expr.c (gfc_trans_pointer_assignment): Correctly handle RHS pointer functions. 2016-06-20 Tobias Burnus <burnus@net-b.de> PR fortran/71194 * gfortran.dg/pointer_remapping_10.f90: New. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@237612 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/fortran/ChangeLog6
-rw-r--r--gcc/fortran/trans-expr.c10
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gfortran.dg/pointer_remapping_10.f9046
4 files changed, 62 insertions, 5 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index d1f384ecc14..bfd3d4ef6f7 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -1,3 +1,9 @@
+2016-06-20 Tobias Burnus <burnus@net-b.de>
+
+ fortran/71194
+ * trans-expr.c (gfc_trans_pointer_assignment): Correctly handle
+ RHS pointer functions.
+
2016-06-19 Bernhard Reutner-Fischer <aldot@gcc.gnu.org>
* class.c (gfc_add_class_array_ref): Call gfc_add_data_component()
diff --git a/gcc/fortran/trans-expr.c b/gcc/fortran/trans-expr.c
index 8f84712931b..b5731aa8bbe 100644
--- a/gcc/fortran/trans-expr.c
+++ b/gcc/fortran/trans-expr.c
@@ -7934,11 +7934,11 @@ 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);
- strlen_rhs = lse.string_length;
+ rse.descriptor_only = 0;
+ rse.expr = tmp;
+ rse.direct_byref = 1;
+ gfc_conv_expr_descriptor (&rse, expr2);
+ strlen_rhs = rse.string_length;
rse.expr = tmp;
}
else
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 1d438528a07..d42a9d71e8e 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2016-06-20 Tobias Burnus <burnus@net-b.de>
+
+ PR fortran/71194
+ * gfortran.dg/pointer_remapping_10.f90: New.
+
2016-06-20 David Malcolm <dmalcolm@redhat.com>
* g++.dg/diagnostic/string-literal-concat.C: New test case.
diff --git a/gcc/testsuite/gfortran.dg/pointer_remapping_10.f90 b/gcc/testsuite/gfortran.dg/pointer_remapping_10.f90
new file mode 100644
index 00000000000..48105069c45
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/pointer_remapping_10.f90
@@ -0,0 +1,46 @@
+! { dg-do run }
+! { dg-options "-fcheck=all" }
+!
+! PR fortran/71194
+!
+! Contributed by T Kondic
+!
+program ice
+implicit none
+integer, parameter :: pa=10, pb=20
+complex, target :: a(pa*pb)
+real, pointer:: ptr(:,:) =>null()
+integer :: i, j, cnt
+logical :: negative
+
+ do i = 1, size(a)
+ a(i) = cmplx(i,-i)
+ end do
+
+ ! Was ICEing before with bounds checks
+ ptr(1:pa*2,1:pb) => conv2real(a)
+
+ negative = .false.
+ cnt = 1
+ do i = 1, ubound(ptr,dim=2)
+ do j = 1, ubound(ptr,dim=1)
+ if (negative) then
+ if (-cnt /= ptr(j, i)) call abort()
+ cnt = cnt + 1
+ negative = .false.
+ else
+ if (cnt /= ptr(j, i)) call abort()
+ negative = .true.
+ end if
+ end do
+ end do
+
+contains
+ function conv2real(carr)
+ use, intrinsic :: iso_c_binding
+ ! returns real pointer to a complex array
+ complex, contiguous, intent(inout), target :: carr(:)
+ real,contiguous,pointer :: conv2real(:)
+ call c_f_pointer(c_loc(carr),conv2real,[size(carr)*2])
+ end function conv2real
+end program