From 1e4b137661742691d56e11d8dfe9342faa4e0c3c Mon Sep 17 00:00:00 2001 From: Tobias Burnus Date: Thu, 3 Nov 2011 23:32:37 +0100 Subject: [PATCH] re PR fortran/50960 ([OOP] vtables not marked as constant) 2011-11-03 Tobias Burnus PR fortran/50960 * trans-decl.c (gfc_finish_var_decl): Mark PARAMETER as * TREE_READONLY. 2011-11-03 Tobias Burnus PR fortran/50960 * gfortran.dg/module_parameter_array_refs_2.f90: New. From-SVN: r180878 --- gcc/fortran/ChangeLog | 5 ++++ gcc/fortran/trans-decl.c | 4 ++++ gcc/testsuite/ChangeLog | 5 ++++ .../module_parameter_array_refs_2.f90 | 23 +++++++++++++++++++ 4 files changed, 37 insertions(+) create mode 100644 gcc/testsuite/gfortran.dg/module_parameter_array_refs_2.f90 diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 802c2ff4ba8..f29eab08abd 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,8 @@ +2011-11-03 Tobias Burnus + + PR fortran/50960 + * trans-decl.c (gfc_finish_var_decl): Mark PARAMETER as TREE_READONLY. + 2011-11-03 Mikael Morin * trans.h (struct gfc_ss, struct gfc_ss_info): Move field diff --git a/gcc/fortran/trans-decl.c b/gcc/fortran/trans-decl.c index b7460b779e2..b90b0ab25b6 100644 --- a/gcc/fortran/trans-decl.c +++ b/gcc/fortran/trans-decl.c @@ -517,6 +517,10 @@ gfc_finish_var_decl (tree decl, gfc_symbol * sym) /* If it wasn't used we wouldn't be getting it. */ TREE_USED (decl) = 1; + if (sym->attr.flavor == FL_PARAMETER + && (sym->attr.dimension || sym->ts.type == BT_DERIVED)) + TREE_READONLY (decl) = 1; + /* Chain this decl to the pending declarations. Don't do pushdecl() because this would add them to the current scope rather than the function scope. */ diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 986bc70ae37..d56107240a9 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2011-11-03 Tobias Burnus + + PR fortran/50960 + * gfortran.dg/module_parameter_array_refs_2.f90: New. + 2011-11-03 Richard Guenther PR middle-end/50079 diff --git a/gcc/testsuite/gfortran.dg/module_parameter_array_refs_2.f90 b/gcc/testsuite/gfortran.dg/module_parameter_array_refs_2.f90 new file mode 100644 index 00000000000..385761d1d17 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/module_parameter_array_refs_2.f90 @@ -0,0 +1,23 @@ +! { dg-do compile } +! { dg-options "-O" } +! { dg-final { scan-assembler-not "i_am_optimized_away" } } +! +! PR fortran/50960 +! +! PARAMETER arrays and derived types exists as static variables. +! Check that the their read-only nature is taken into account +! when optimizations are done. +! + +module m + integer, parameter :: PARA(*) = [1,2,3,4,5,6,7,8,9,10] +end module m + +subroutine test() +use m +integer :: i +i = 1 +if (para(i) /= 1) call i_am_optimized_away() +end + +! { dg-final { cleanup-modules "m" } }