summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authortkoenig <tkoenig@138bc75d-0d04-0410-961f-82ee72b054a4>2017-10-07 11:48:28 +0000
committertkoenig <tkoenig@138bc75d-0d04-0410-961f-82ee72b054a4>2017-10-07 11:48:28 +0000
commitf7f62573653da3e31a3a6e5869ffd2260445a395 (patch)
tree2b203f2950f7fe7ca5f8344d3962aa131b60d08a
parent233c58a74c69f62fe4c5b7a73a9a92868bb8625a (diff)
downloadgcc-f7f62573653da3e31a3a6e5869ffd2260445a395.tar.gz
2017-10-07 Thomas Koenig <tkoenig@gcc.gnu.org>
PR fortran/49232 * expr.c (gfc_check_pointer_assign): Error for non-contiguous rhs. 2017-10-07 Thomas Koenig <tkoenig@gcc.gnu.org> PR fortran/49232 * gfortran.dg/contiguous_4.f90: New test. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@253509 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/fortran/ChangeLog6
-rw-r--r--gcc/fortran/expr.c8
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gfortran.dg/contiguous_4.f9019
4 files changed, 38 insertions, 0 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index 8d3e35f0e7d..67a5b02e43b 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -1,5 +1,11 @@
2017-10-07 Thomas Koenig <tkoenig@gcc.gnu.org>
+ PR fortran/49232
+ * expr.c (gfc_check_pointer_assign): Error
+ for non-contiguous rhs.
+
+2017-10-07 Thomas Koenig <tkoenig@gcc.gnu.org>
+
* gfortran.h (async_io_dt): Add external reference.
* io.c (async_io_dt): Add variable.
(compare_to_allowed_values): Add prototyte. Add optional argument
diff --git a/gcc/fortran/expr.c b/gcc/fortran/expr.c
index bfbb19ee577..bc05db2fbae 100644
--- a/gcc/fortran/expr.c
+++ b/gcc/fortran/expr.c
@@ -3851,6 +3851,14 @@ gfc_check_pointer_assign (gfc_expr *lvalue, gfc_expr *rvalue)
}
}
+ /* Error for assignments of contiguous pointers to targets which is not
+ contiguous. Be lenient in the definition of what counts as
+ congiguous. */
+
+ if (lhs_attr.contiguous && !gfc_is_simply_contiguous (rvalue, false, true))
+ gfc_error ("Assignment to contiguous pointer from non-contiguous "
+ "target at %L", &rvalue->where);
+
/* Warn if it is the LHS pointer may lives longer than the RHS target. */
if (warn_target_lifetime
&& rvalue->expr_type == EXPR_VARIABLE
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index e48f743168c..319518c6e8a 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2017-10-07 Thomas Koenig <tkoenig@gcc.gnu.org>
+
+ PR fortran/49232
+ * gfortran.dg/contiguous_4.f90: New test.
+
2017-10-06 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/66690
diff --git a/gcc/testsuite/gfortran.dg/contiguous_4.f90 b/gcc/testsuite/gfortran.dg/contiguous_4.f90
new file mode 100644
index 00000000000..b05dcfbaa84
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/contiguous_4.f90
@@ -0,0 +1,19 @@
+! { dg-do compile }
+program cont_01_neg
+ implicit none
+ real, pointer, contiguous :: r(:)
+ real, pointer, contiguous :: r2(:,:)
+ real, target :: x(45)
+ real, target :: x2(5,9)
+ integer :: i
+ integer :: n=1
+
+ x = (/ (real(i),i=1,45) /)
+ x2 = reshape(x,shape(x2))
+ r => x(::3) ! { dg-error "Assignment to contiguous pointer" }
+ r2 => x2(2:,:) ! { dg-error "Assignment to contiguous pointer" }
+ r2 => x2(:,2:3)
+ r => x2(2:3,1)
+ r => x(::1)
+ r => x(::n) ! { dg-error "Assignment to contiguous pointer" }
+end program