aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFrancois-Xavier Coudert <coudert@clipper.ens.fr>2006-06-18 19:36:47 +0200
committerFrançois-Xavier Coudert <fxcoudert@gcc.gnu.org>2006-06-18 17:36:47 +0000
commit98efaf34b2eb96a00b58966b32a7b3081150f1c5 (patch)
tree2cbdd35fbaca8b936aaae208218a266895056c58
parenta9c46998892e1750613e81684b9c49ed42d4d841 (diff)
downloadgcc-98efaf34b2eb96a00b58966b32a7b3081150f1c5.zip
gcc-98efaf34b2eb96a00b58966b32a7b3081150f1c5.tar.gz
gcc-98efaf34b2eb96a00b58966b32a7b3081150f1c5.tar.bz2
re PR fortran/26801 (-fbounds-check generates segfault)
PR fortran/26801 * trans-intrinsic.c (gfc_conv_associated): Use pre and post blocks of the scalarization expression. * gfortran.dg/associated_4.f90: New test. From-SVN: r114757
-rw-r--r--gcc/fortran/ChangeLog6
-rw-r--r--gcc/fortran/trans-intrinsic.c4
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gfortran.dg/associated_4.f9020
4 files changed, 35 insertions, 0 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index b2b9354..935adf5 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -1,3 +1,9 @@
+2006-06-18 Francois-Xavier Coudert <coudert@clipper.ens.fr>
+
+ PR fortran/26801
+ * trans-intrinsic.c (gfc_conv_associated): Use pre and post blocks
+ of the scalarization expression.
+
2006-06-18 Jerry DeLisle <jvdelisle@gcc.gnu.org>
PR fortran/19310
diff --git a/gcc/fortran/trans-intrinsic.c b/gcc/fortran/trans-intrinsic.c
index 9d6a0b7..b4863a0 100644
--- a/gcc/fortran/trans-intrinsic.c
+++ b/gcc/fortran/trans-intrinsic.c
@@ -2840,6 +2840,8 @@ gfc_conv_associated (gfc_se *se, gfc_expr *expr)
gfc_conv_expr_lhs (&arg1se, arg1->expr);
tmp2 = gfc_conv_descriptor_data_get (arg1se.expr);
}
+ gfc_add_block_to_block (&se->pre, &arg1se.pre);
+ gfc_add_block_to_block (&se->post, &arg1se.post);
tmp = build2 (NE_EXPR, boolean_type_node, tmp2,
fold_convert (TREE_TYPE (tmp2), null_pointer_node));
se->expr = tmp;
@@ -2863,6 +2865,8 @@ gfc_conv_associated (gfc_se *se, gfc_expr *expr)
gfc_conv_expr (&arg1se, arg1->expr);
arg2se.want_pointer = 1;
gfc_conv_expr (&arg2se, arg2->expr);
+ gfc_add_block_to_block (&se->pre, &arg1se.pre);
+ gfc_add_block_to_block (&se->post, &arg1se.post);
tmp = build2 (EQ_EXPR, boolean_type_node, arg1se.expr, arg2se.expr);
se->expr = tmp;
}
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index c0e3fa2..985d645 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2006-06-18 Francois-Xavier Coudert <coudert@clipper.ens.fr>
+
+ PR fortran/26801
+ * gfortran.dg/associated_4.f90: New test.
+
2006-06-18 Jerry DeLisle <jvdelisle@gcc.gnu.org>
PR fortran/19310
diff --git a/gcc/testsuite/gfortran.dg/associated_4.f90 b/gcc/testsuite/gfortran.dg/associated_4.f90
new file mode 100644
index 0000000..dd4490b
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/associated_4.f90
@@ -0,0 +1,20 @@
+! { dg-do run }
+! PR fortran/26801
+ implicit none
+
+ integer :: i
+ integer,target :: u
+ logical :: l
+ character(len=8) :: A
+ type dt
+ integer, pointer :: a => NULL()
+ end type dt
+ type(dt) :: obj(2)
+
+ i = 2
+ l = associated(obj(i)%a)
+ write(A,*) l
+ l = associated(obj(i)%a,u)
+ print *, l
+ write(A,*) l
+end