This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[PATCH] PR fortran/67885 -- PARAMETER needs to be marked in BLOCK
- From: Steve Kargl <sgk at troutmask dot apl dot washington dot edu>
- To: fortran at gcc dot gnu dot org, gcc-patches at gcc dot gnu dot org
- Date: Mon, 26 Oct 2015 12:55:01 -0700
- Subject: [PATCH] PR fortran/67885 -- PARAMETER needs to be marked in BLOCK
- Authentication-results: sourceware.org; auth=none
When an specification statement in a BLOCK construct has a
PARAMETER attribute, gfortran currently discards the entity.
This patch marks PARAMETER entity if in a BLOCK. I'm not
complete convince that this is the right fix, but it does
allow the testcase to compile and run. Built and tested
on x86_64-*-freebsd. OK to commit (if not no one has a
better patch)?
2015-10-26 Steven G. Kargl <kargl@gcc.gnu.org>
PR fortran/67885
* trans-decl.c (generate_local_decl): Mark PARAMETER entities in
BLOCK construct.
2015-10-26 Steven G. Kargl <kargl@gcc.gnu.org>
PR fortran/67885
* gfortran.dg/pr67885.f90: New test.
--
Steve
Index: gcc/fortran/trans-decl.c
===================================================================
--- gcc/fortran/trans-decl.c (revision 229390)
+++ gcc/fortran/trans-decl.c (working copy)
@@ -5217,6 +5217,16 @@ generate_local_decl (gfc_symbol * sym)
"Unused parameter %qs which has been explicitly "
"imported at %L", sym->name, &sym->declared_at);
}
+
+ if (sym->ns
+ && sym->ns->parent
+ && sym->ns->parent->code
+ && sym->ns->parent->code->op == EXEC_BLOCK)
+ {
+ if (sym->attr.referenced)
+ gfc_get_symbol_decl (sym);
+ sym->mark = 1;
+ }
}
else if (sym->attr.flavor == FL_PROCEDURE)
{
Index: gcc/testsuite/gfortran.dg/pr67885.f90
===================================================================
--- gcc/testsuite/gfortran.dg/pr67885.f90 (revision 0)
+++ gcc/testsuite/gfortran.dg/pr67885.f90 (working copy)
@@ -0,0 +1,12 @@
+! { dg-do run }
+! PR fortran/67885
+! Original code contributed by Gerhard Steinmetz
+! gerhard dot steinmetz dot fortran at t-online dot de
+program p
+ block
+ integer, parameter :: a(2) = [1, 2]
+ integer :: x(2)
+ x = a
+ if (x(1) /= 1) call abort
+ end block
+end