From fdc55763b63d833dccd47781ff5d4b09dd96c1c1 Mon Sep 17 00:00:00 2001 From: Paul Thomas Date: Sat, 22 Sep 2007 15:46:41 +0000 Subject: [PATCH] re PR fortran/33337 (ICE in gfc_finish_var_decl, at fortran/trans-decl.c:510) 2007-09-22 Paul Thomas PR fortran/33337 PR fortran/33376 * trans-decl.c (gfc_create_module_variable): Output derived type parameters. * arith.c (gfc_parentheses): Return the argument if it is a constant expression. * primary.c (gfc_match_rvalue): Remove the clearing of the module name and the use_assoc attribute for derived type parameter expressions. 2007-09-22 Paul Thomas PR fortran/33337 * gfortran.dg/derived_comp_array_ref_3.f90: New test. PR fortran/33376 * gfortran.dg/derived_comp_array_ref_4.f90: New test. From-SVN: r128672 --- gcc/fortran/ChangeLog | 12 ++++++ gcc/fortran/arith.c | 3 ++ gcc/fortran/primary.c | 13 +++---- gcc/fortran/trans-decl.c | 6 ++- gcc/testsuite/ChangeLog | 8 ++++ .../gfortran.dg/derived_comp_array_ref_3.f90 | 29 ++++++++++++++ .../gfortran.dg/derived_comp_array_ref_4.f90 | 38 +++++++++++++++++++ 7 files changed, 100 insertions(+), 9 deletions(-) create mode 100644 gcc/testsuite/gfortran.dg/derived_comp_array_ref_3.f90 create mode 100644 gcc/testsuite/gfortran.dg/derived_comp_array_ref_4.f90 diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 36904b2766c..cb8f7ccb664 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,15 @@ +2007-09-22 Paul Thomas + + PR fortran/33337 + PR fortran/33376 + * trans-decl.c (gfc_create_module_variable): Output + derived type parameters. + * arith.c (gfc_parentheses): Return the argument if + it is a constant expression. + * primary.c (gfc_match_rvalue): Remove the clearing of + the module name and the use_assoc attribute for derived + type parameter expressions. + 2007-09-22 Francois-Xavier Coudert PR fortran/33502 diff --git a/gcc/fortran/arith.c b/gcc/fortran/arith.c index 149f93f08e1..7e3d0a4f24c 100644 --- a/gcc/fortran/arith.c +++ b/gcc/fortran/arith.c @@ -1793,6 +1793,9 @@ eval_intrinsic_f3 (gfc_intrinsic_op operator, gfc_expr * gfc_parentheses (gfc_expr *op) { + if (gfc_is_constant_expr (op)) + return op; + return eval_intrinsic_f2 (INTRINSIC_PARENTHESES, gfc_arith_identity, op, NULL); } diff --git a/gcc/fortran/primary.c b/gcc/fortran/primary.c index f62299613fb..575a4c7411a 100644 --- a/gcc/fortran/primary.c +++ b/gcc/fortran/primary.c @@ -2148,11 +2148,12 @@ gfc_match_rvalue (gfc_expr **result) if (sym->ts.is_c_interop || sym->ts.is_iso_c) break; - /* Variable array references to derived type parameters cause - all sorts of headaches in simplification. Make them variable - and scrub any module identity because they do not appear to - be referencable from the module. */ - if (sym->value && sym->ts.type == BT_DERIVED && e->ref) + /* Variable array references to use associated derived type + parameters cause all sorts of headaches in simplification. + For this reason, we write the parameter to the module and + treat them as variable references. */ + if (sym->value && sym->ts.type == BT_DERIVED + && sym->attr.use_assoc && e->ref) { for (ref = e->ref; ref; ref = ref->next) if (ref->type == REF_ARRAY) @@ -2168,8 +2169,6 @@ gfc_match_rvalue (gfc_expr **result) e->expr_type = EXPR_VARIABLE; e->symtree = symtree; e->ref = ref; - sym->attr.use_assoc = 0; - sym->module = NULL; } break; diff --git a/gcc/fortran/trans-decl.c b/gcc/fortran/trans-decl.c index 854ca54af02..e27a04bd4c7 100644 --- a/gcc/fortran/trans-decl.c +++ b/gcc/fortran/trans-decl.c @@ -2764,9 +2764,11 @@ gfc_create_module_variable (gfc_symbol * sym) && sym->ts.type == BT_DERIVED) sym->backend_decl = gfc_typenode_for_spec (&(sym->ts)); - /* Only output variables and array valued parameters. */ + /* Only output variables and array valued, or derived type, + parameters. */ if (sym->attr.flavor != FL_VARIABLE - && (sym->attr.flavor != FL_PARAMETER || sym->attr.dimension == 0)) + && !(sym->attr.flavor == FL_PARAMETER + && (sym->attr.dimension || sym->ts.type == BT_DERIVED))) return; /* Don't generate variables from other modules. Variables from diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 96387b225d1..bad83314714 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,11 @@ +2007-09-22 Paul Thomas + + PR fortran/33337 + * gfortran.dg/derived_comp_array_ref_3.f90: New test. + + PR fortran/33376 + * gfortran.dg/derived_comp_array_ref_4.f90: New test. + 2007-09-22 Tobias Burnus PR fortran/33445 diff --git a/gcc/testsuite/gfortran.dg/derived_comp_array_ref_3.f90 b/gcc/testsuite/gfortran.dg/derived_comp_array_ref_3.f90 new file mode 100644 index 00000000000..53d73e78802 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/derived_comp_array_ref_3.f90 @@ -0,0 +1,29 @@ +! { dg-do run } +! Tests the fix for PR33337, which was partly associated with +! the problem in PR31564 and, in addition, the parentheses in +! the initialization expression for the_chi_square. +! +! Contributed by Michael Richmond +! +MODULE cdf_nc_chisq_mod + PUBLIC + TYPE :: one_parameter + INTEGER :: high_bound + END TYPE one_parameter + TYPE :: the_distribution + TYPE (one_parameter) :: parameters(1) + END TYPE the_distribution + TYPE (the_distribution), PARAMETER :: the_chi_square = & + the_distribution((/(one_parameter(99))/)) +CONTAINS + SUBROUTINE local_cum_nc_chisq() + integer :: df0 + df0 = the_chi_square%parameters(1)%high_bound + print *, df0 + END SUBROUTINE local_cum_nc_chisq +END MODULE cdf_nc_chisq_mod + + use cdf_nc_chisq_mod + call local_cum_nc_chisq +end +! { dg-final { cleanup-modules "cdf_aux_mod cdf_beta_mod" } } diff --git a/gcc/testsuite/gfortran.dg/derived_comp_array_ref_4.f90 b/gcc/testsuite/gfortran.dg/derived_comp_array_ref_4.f90 new file mode 100644 index 00000000000..0c7853989e5 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/derived_comp_array_ref_4.f90 @@ -0,0 +1,38 @@ +! { dg-do run } +! Tests the fix for PR33376, which was a regression caused by the +! fix for PR31564. +! +! Contributed by Harald Anlauf +! +module foo + implicit none + public chk + + type mytype + character(len=4) :: str + end type mytype + type (mytype) ,parameter :: chk (2) & + = (/ mytype ("abcd") , mytype ("efgh") /) +end module foo + +module gfcbug70 + use foo, only: chk_ => chk + implicit none +contains + + subroutine chk (i) + integer, intent(in) :: i + if (i .eq. 1) then + if (chk_(i)% str .ne. "abcd") call abort () + else + if (chk_(i)% str .ne. "efgh") call abort () + end if + + end subroutine chk +end module gfcbug70 + + use gfcbug70 + call chk (2) + call chk (1) +end +! { dg-final { cleanup-modules "foo gfcbug70" } }