Patch, fortran] PR61406 - [4.9/4.10 Regression] ICE on ASSOCIATE construct to literal array expression
Paul Richard Thomas
paul.richard.thomas@gmail.com
Mon Jun 9 09:43:00 GMT 2014
Dear All,
This was a slip up on my part. The fix is obvious - OK for trunk and 4.9?
Cheers
Paul
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
-------------- next part --------------
Index: gcc/fortran/trans-stmt.c
===================================================================
*** gcc/fortran/trans-stmt.c (revision 211365)
--- gcc/fortran/trans-stmt.c (working copy)
*************** trans_associate_var (gfc_symbol *sym, gf
*** 1167,1179 ****
{
gfc_se se;
tree desc;
desc = sym->backend_decl;
/* 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)
{
se.direct_byref = 1;
se.use_offset = 1;
--- 1167,1182 ----
{
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 || cst_array_ctor)
{
se.direct_byref = 1;
se.use_offset = 1;
*************** trans_associate_var (gfc_symbol *sym, gf
*** 1184,1190 ****
/* 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)
{
int dim;
--- 1187,1193 ----
/* If we didn't already do the pointer assignment, set associate-name
descriptor to the one generated for the temporary. */
! if (!sym->assoc->variable && !cst_array_ctor)
{
int dim;
Index: gcc/testsuite/gfortran.dg/associate_17.f90
===================================================================
*** gcc/testsuite/gfortran.dg/associate_17.f90 (revision 0)
--- gcc/testsuite/gfortran.dg/associate_17.f90 (working copy)
***************
*** 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
More information about the Gcc-patches
mailing list