re PR fortran/71523 (Static variables given automatic initializers with -finit-* and -fmax-stack-var-size)
2016-07-17 Fritz Reese <fritzoreese@gmail.com> PR fortran/71523 * trans-decl.c (gfc_finish_var_decl): Replace automatic initializer with a static one. * gfortran.dg/pr71523_1.f90: New test. * gfortran.dg/pr71523_2.f90: New test. From-SVN: r238420
This commit is contained in:
parent
48b3613757
commit
43068916e3
@ -1,3 +1,9 @@
|
||||
2016-07-17 Fritz Reese <fritzoreese@gmail.com>
|
||||
|
||||
PR fortran/71523
|
||||
* trans-decl.c (gfc_finish_var_decl): Replace automatic initializer with
|
||||
a static one.
|
||||
|
||||
2016-07-15 Jerry DeLisle <jvdelisle@gcc.gnu.org>
|
||||
Marco Restelli <mrestelli@gmail.com>
|
||||
|
||||
|
@ -657,7 +657,43 @@ gfc_finish_var_decl (tree decl, gfc_symbol * sym)
|
||||
|| sym->attr.pointer
|
||||
|| sym->attr.allocatable)
|
||||
&& !DECL_ARTIFICIAL (decl))
|
||||
TREE_STATIC (decl) = 1;
|
||||
{
|
||||
TREE_STATIC (decl) = 1;
|
||||
|
||||
/* Because the size of this variable isn't known until now, we may have
|
||||
greedily added an initializer to this variable (in build_init_assign)
|
||||
even though the max-stack-var-size indicates the variable should be
|
||||
static. Therefore we rip out the automatic initializer here and
|
||||
replace it with a static one. */
|
||||
gfc_symtree *st = gfc_find_symtree (sym->ns->sym_root, sym->name);
|
||||
gfc_code *prev = NULL;
|
||||
gfc_code *code = sym->ns->code;
|
||||
while (code && code->op == EXEC_INIT_ASSIGN)
|
||||
{
|
||||
/* Look for an initializer meant for this symbol. */
|
||||
if (code->expr1->symtree == st)
|
||||
{
|
||||
if (prev)
|
||||
prev->next = code->next;
|
||||
else
|
||||
sym->ns->code = code->next;
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
prev = code;
|
||||
code = code->next;
|
||||
}
|
||||
if (code && code->op == EXEC_INIT_ASSIGN)
|
||||
{
|
||||
/* Keep the init expression for a static initializer. */
|
||||
sym->value = code->expr2;
|
||||
/* Cleanup the defunct code object, without freeing the init expr. */
|
||||
code->expr2 = NULL;
|
||||
gfc_free_statement (code);
|
||||
free (code);
|
||||
}
|
||||
}
|
||||
|
||||
/* Handle threadprivate variables. */
|
||||
if (sym->attr.threadprivate
|
||||
@ -1693,7 +1729,7 @@ gfc_get_symbol_decl (gfc_symbol * sym)
|
||||
if (TREE_STATIC (decl)
|
||||
&& !(sym->attr.use_assoc && !intrinsic_array_parameter)
|
||||
&& (sym->attr.save || sym->ns->proc_name->attr.is_main_program
|
||||
|| flag_max_stack_var_size == 0
|
||||
|| !gfc_can_put_var_on_stack (DECL_SIZE_UNIT (decl))
|
||||
|| sym->attr.data || sym->ns->proc_name->attr.flavor == FL_MODULE)
|
||||
&& (flag_coarray != GFC_FCOARRAY_LIB
|
||||
|| !sym->attr.codimension || sym->attr.allocatable))
|
||||
|
@ -1,3 +1,9 @@
|
||||
2016-07-17 Fritz Reese <fritzoreese@gmail.com>
|
||||
|
||||
PR fortran/71523
|
||||
* gfortran.dg/pr71523_1.f90: New test.
|
||||
* gfortran.dg/pr71523_2.f90: New test.
|
||||
|
||||
2016-07-16 Andreas Schwab <schwab@linux-m68k.org>
|
||||
|
||||
* g++.dg/cpp0x/nullptr35.C (caught): Fix typo.
|
||||
|
22
gcc/testsuite/gfortran.dg/pr71523_1.f90
Normal file
22
gcc/testsuite/gfortran.dg/pr71523_1.f90
Normal file
@ -0,0 +1,22 @@
|
||||
! PR Fortran/71523
|
||||
!
|
||||
! { dg-do compile }
|
||||
! { dg-options "-fdump-tree-original -finit-local-zero -fautomatic -fmax-stack-var-size=8" }
|
||||
!
|
||||
! Make sure that variables larger than max-stack-var-size which become
|
||||
! static are not given automatic initializers on function entry.
|
||||
!
|
||||
|
||||
function set(idx, val)
|
||||
implicit none
|
||||
integer, intent(in) :: idx, val
|
||||
integer set
|
||||
integer arr(100)
|
||||
|
||||
set = arr(idx)
|
||||
arr(idx) = val
|
||||
return
|
||||
end function
|
||||
|
||||
! There should be no automatic initializer for arr
|
||||
! { dg-final { scan-tree-dump-times "arr = " 0 "original" } }
|
38
gcc/testsuite/gfortran.dg/pr71523_2.f90
Normal file
38
gcc/testsuite/gfortran.dg/pr71523_2.f90
Normal file
@ -0,0 +1,38 @@
|
||||
! PR Fortran/71523
|
||||
!
|
||||
! { dg-do run }
|
||||
! { dg-options "-finit-integer=12345 -fautomatic -fmax-stack-var-size=8" }
|
||||
!
|
||||
! Make sure that variables larger than max-stack-var-size become
|
||||
! static and are given the correct _static_ initializer.
|
||||
!
|
||||
|
||||
function set(idx, val)
|
||||
implicit none
|
||||
integer, intent(in) :: idx, val
|
||||
integer set
|
||||
integer arr(100)
|
||||
|
||||
set = arr(idx)
|
||||
arr(idx) = val
|
||||
return
|
||||
end function
|
||||
|
||||
integer set, val
|
||||
|
||||
val = set(1, 5)
|
||||
if (val .ne. 12345) then
|
||||
call abort()
|
||||
endif
|
||||
|
||||
val = set(1, 10)
|
||||
if (val .ne. 5) then
|
||||
call abort()
|
||||
endif
|
||||
|
||||
val = set(1, 100)
|
||||
if (val .ne. 10) then
|
||||
call abort()
|
||||
endif
|
||||
|
||||
end
|
Loading…
Reference in New Issue
Block a user