summaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorpault <pault@138bc75d-0d04-0410-961f-82ee72b054a4>2014-06-09 11:55:55 +0000
committerpault <pault@138bc75d-0d04-0410-961f-82ee72b054a4>2014-06-09 11:55:55 +0000
commit007dd57def1952b038d5a517dff77a421f3b4073 (patch)
treeef9a8fef2bd0b52beda4eb3b6e09351a78deccf3 /gcc
parentda4ae354ac898fc00e98428143dcfce0edaee941 (diff)
downloadgcc-007dd57def1952b038d5a517dff77a421f3b4073.tar.gz
2014-06-09 Paul Thomas <pault@gcc.gnu.org>
PR fortran/61406 * trans-stmt.c (trans_associate_var): Check that array constructors are constant for direct reference. 2014-06-09 Paul Thomas <pault@gcc.gnu.org> PR fortran/61406 * gfortran.dg/associate_17.f90 : New test git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@211374 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc')
-rw-r--r--gcc/fortran/ChangeLog8
-rw-r--r--gcc/fortran/trans-stmt.c7
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gfortran.dg/associate_17.f9012
4 files changed, 29 insertions, 3 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index f84cd8e2f8a..c0443337c53 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -1,3 +1,9 @@
+2014-06-09 Paul Thomas <pault@gcc.gnu.org>
+
+ PR fortran/61406
+ * trans-stmt.c (trans_associate_var): Check that array
+ constructors are constant for direct reference.
+
2014-06-09 Francois-Xavier Coudert <fxcoudert@gcc.gnu.org>
PR fortran/36096
@@ -333,7 +339,7 @@
* trans.c (trans_code): Handle EXEC_OMP_CANCEL,
EXEC_OMP_CANCELLATION_POINT, EXEC_OMP_DO_SIMD,
EXEC_OMP_PARALLEL_DO_SIMD, EXEC_OMP_SIMD and EXEC_OMP_TASKGROUP.
- * resolve.c (gfc_resolve_blocks): Handle EXEC_OMP_DO_SIMD,
+ * resolve.c (gfc_resolve_blocks): Handle EXEC_OMP_DO_SIMD,
EXEC_OMP_PARALLEL_DO_SIMD, EXEC_OMP_SIMD and EXEC_OMP_TASKGROUP.
(resolve_code): Handle EXEC_OMP_CANCEL,
EXEC_OMP_CANCELLATION_POINT, EXEC_OMP_DO_SIMD,
diff --git a/gcc/fortran/trans-stmt.c b/gcc/fortran/trans-stmt.c
index 212a2586d2a..547e9c1bb91 100644
--- a/gcc/fortran/trans-stmt.c
+++ b/gcc/fortran/trans-stmt.c
@@ -1167,13 +1167,16 @@ trans_associate_var (gfc_symbol *sym, gfc_wrapped_block *block)
{
gfc_se se;
tree desc;
+ bool cst_array_ctor;
desc = sym->backend_decl;
+ cst_array_ctor = e->expr_type == EXPR_ARRAY
+ && gfc_constant_array_constructor_p (e->value.constructor);
/* If association is to an expression, evaluate it and create temporary.
Otherwise, get descriptor of target for pointer assignment. */
gfc_init_se (&se, NULL);
- if (sym->assoc->variable || e->expr_type == EXPR_ARRAY)
+ if (sym->assoc->variable || cst_array_ctor)
{
se.direct_byref = 1;
se.use_offset = 1;
@@ -1184,7 +1187,7 @@ trans_associate_var (gfc_symbol *sym, gfc_wrapped_block *block)
/* If we didn't already do the pointer assignment, set associate-name
descriptor to the one generated for the temporary. */
- if (!sym->assoc->variable && e->expr_type != EXPR_ARRAY)
+ if (!sym->assoc->variable && !cst_array_ctor)
{
int dim;
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 544b80be584..f3b2c6ab427 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2014-06-09 Paul Thomas <pault@gcc.gnu.org>
+
+ PR fortran/61406
+ * gfortran.dg/associate_17.f90 : New test
+
2014-06-09 Petr Murzin <petr.murzin@intel.com>
* gcc.target/i386/avx512f-vaddpd-2.c: Add static void for CALC,
diff --git a/gcc/testsuite/gfortran.dg/associate_17.f90 b/gcc/testsuite/gfortran.dg/associate_17.f90
new file mode 100644
index 00000000000..5c39cf06247
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/associate_17.f90
@@ -0,0 +1,12 @@
+! { dg-do run }
+! Test the fix for PR61406
+! Contributed by Adam Hirst <adam@aphirst.karoo.co.uk>
+program test
+ implicit none
+ real :: theta = 1.0
+
+ associate (n => [cos(theta), sin(theta)])
+ if (abs (norm2(n) - 1.0) .gt. 1.0e-4) call abort
+ end associate
+
+end program test