aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJanus Weil <janus@gcc.gnu.org>2014-02-21 23:54:50 +0100
committerJanus Weil <janus@gcc.gnu.org>2014-02-21 23:54:50 +0100
commitf1ed9e151e1263e32142fa3fe3909d48964c72c2 (patch)
treead96c11489b4f82b4d9dcd96d716aa8436b7a1eb /gcc
parentd723358d0167b16e3fdffe71e4e5267e3ce01a5f (diff)
downloadgcc-f1ed9e151e1263e32142fa3fe3909d48964c72c2.zip
gcc-f1ed9e151e1263e32142fa3fe3909d48964c72c2.tar.gz
gcc-f1ed9e151e1263e32142fa3fe3909d48964c72c2.tar.bz2
re PR fortran/60302 (ICE with c_f_pointer and android cross compiler)
2014-02-21 Janus Weil <janus@gcc.gnu.org> PR fortran/60302 * check.c (gfc_check_c_f_pointer): Only clear 'size' if 'gfc_array_size' is successful. 2014-02-21 Janus Weil <janus@gcc.gnu.org> PR fortran/60302 * gfortran.dg/c_f_pointer_shape_tests_6.f90: New. From-SVN: r208033
Diffstat (limited to 'gcc')
-rw-r--r--gcc/fortran/ChangeLog6
-rw-r--r--gcc/fortran/check.c15
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gfortran.dg/c_f_pointer_shape_tests_6.f9014
4 files changed, 33 insertions, 7 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index c27a1d0..995ede7 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -1,5 +1,11 @@
2014-02-21 Janus Weil <janus@gcc.gnu.org>
+ PR fortran/60302
+ * check.c (gfc_check_c_f_pointer): Only clear 'size' if 'gfc_array_size'
+ is successful.
+
+2014-02-21 Janus Weil <janus@gcc.gnu.org>
+
PR fortran/60234
* gfortran.h (gfc_build_class_symbol): Removed argument.
* class.c (gfc_add_component_ref): Fix up missing vtype if necessary.
diff --git a/gcc/fortran/check.c b/gcc/fortran/check.c
index 4282030..119750a 100644
--- a/gcc/fortran/check.c
+++ b/gcc/fortran/check.c
@@ -3944,16 +3944,17 @@ gfc_check_c_f_pointer (gfc_expr *cptr, gfc_expr *fptr, gfc_expr *shape)
if (shape)
{
mpz_t size;
-
- if (gfc_array_size (shape, &size)
- && mpz_cmp_ui (size, fptr->rank) != 0)
+ if (gfc_array_size (shape, &size))
{
+ if (mpz_cmp_ui (size, fptr->rank) != 0)
+ {
+ mpz_clear (size);
+ gfc_error ("SHAPE argument at %L to C_F_POINTER must have the same "
+ "size as the RANK of FPTR", &shape->where);
+ return false;
+ }
mpz_clear (size);
- gfc_error ("SHAPE argument at %L to C_F_POINTER must have the same "
- "size as the RANK of FPTR", &shape->where);
- return false;
}
- mpz_clear (size);
}
if (fptr->ts.type == BT_CLASS)
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 8f8f35b..0301079 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2014-02-21 Janus Weil <janus@gcc.gnu.org>
+
+ PR fortran/60302
+ * gfortran.dg/c_f_pointer_shape_tests_6.f90: New.
+
2014-02-21 Bill Schmidt <wschmidt@linux.vnet.ibm.com>
* gcc.dg/vmx/vsums.c: Check entire result vector.
diff --git a/gcc/testsuite/gfortran.dg/c_f_pointer_shape_tests_6.f90 b/gcc/testsuite/gfortran.dg/c_f_pointer_shape_tests_6.f90
new file mode 100644
index 0000000..dd9b163
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/c_f_pointer_shape_tests_6.f90
@@ -0,0 +1,14 @@
+! { dg-do compile }
+!
+! PR 60302: [4.9 Regression] ICE with c_f_pointer and android cross compiler
+!
+! Contributed by Valery Weber <valeryweber@hotmail.com>
+
+subroutine reshape_inplace_c2_c2 (new_shape)
+ use, intrinsic :: iso_c_binding
+ implicit none
+ integer :: new_shape(:)
+ complex, pointer :: ptr_x(:)
+ type(c_ptr) :: loc_x
+ call c_f_pointer (loc_x, ptr_x, new_shape)
+end subroutine