Commit fdc55763 by Paul Thomas

re PR fortran/33337 (ICE in gfc_finish_var_decl, at fortran/trans-decl.c:510)

2007-09-22  Paul Thomas  <pault@gcc.gnu.org>

	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  <pault@gcc.gnu.org>

	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
parent a3b2d4e5
2007-09-22 Paul Thomas <pault@gcc.gnu.org>
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 <fxcoudert@gcc.gnu.org> 2007-09-22 Francois-Xavier Coudert <fxcoudert@gcc.gnu.org>
PR fortran/33502 PR fortran/33502
......
...@@ -1793,6 +1793,9 @@ eval_intrinsic_f3 (gfc_intrinsic_op operator, ...@@ -1793,6 +1793,9 @@ eval_intrinsic_f3 (gfc_intrinsic_op operator,
gfc_expr * gfc_expr *
gfc_parentheses (gfc_expr *op) gfc_parentheses (gfc_expr *op)
{ {
if (gfc_is_constant_expr (op))
return op;
return eval_intrinsic_f2 (INTRINSIC_PARENTHESES, gfc_arith_identity, return eval_intrinsic_f2 (INTRINSIC_PARENTHESES, gfc_arith_identity,
op, NULL); op, NULL);
} }
......
...@@ -2148,11 +2148,12 @@ gfc_match_rvalue (gfc_expr **result) ...@@ -2148,11 +2148,12 @@ gfc_match_rvalue (gfc_expr **result)
if (sym->ts.is_c_interop || sym->ts.is_iso_c) if (sym->ts.is_c_interop || sym->ts.is_iso_c)
break; break;
/* Variable array references to derived type parameters cause /* Variable array references to use associated derived type
all sorts of headaches in simplification. Make them variable parameters cause all sorts of headaches in simplification.
and scrub any module identity because they do not appear to For this reason, we write the parameter to the module and
be referencable from the module. */ treat them as variable references. */
if (sym->value && sym->ts.type == BT_DERIVED && e->ref) if (sym->value && sym->ts.type == BT_DERIVED
&& sym->attr.use_assoc && e->ref)
{ {
for (ref = e->ref; ref; ref = ref->next) for (ref = e->ref; ref; ref = ref->next)
if (ref->type == REF_ARRAY) if (ref->type == REF_ARRAY)
...@@ -2168,8 +2169,6 @@ gfc_match_rvalue (gfc_expr **result) ...@@ -2168,8 +2169,6 @@ gfc_match_rvalue (gfc_expr **result)
e->expr_type = EXPR_VARIABLE; e->expr_type = EXPR_VARIABLE;
e->symtree = symtree; e->symtree = symtree;
e->ref = ref; e->ref = ref;
sym->attr.use_assoc = 0;
sym->module = NULL;
} }
break; break;
......
...@@ -2764,9 +2764,11 @@ gfc_create_module_variable (gfc_symbol * sym) ...@@ -2764,9 +2764,11 @@ gfc_create_module_variable (gfc_symbol * sym)
&& sym->ts.type == BT_DERIVED) && sym->ts.type == BT_DERIVED)
sym->backend_decl = gfc_typenode_for_spec (&(sym->ts)); 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 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; return;
/* Don't generate variables from other modules. Variables from /* Don't generate variables from other modules. Variables from
......
2007-09-22 Paul Thomas <pault@gcc.gnu.org>
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 <burnus@net-b.de> 2007-09-22 Tobias Burnus <burnus@net-b.de>
PR fortran/33445 PR fortran/33445
! { 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 <michael.a.richmond@nasa.gov>
!
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" } }
! { dg-do run }
! Tests the fix for PR33376, which was a regression caused by the
! fix for PR31564.
!
! Contributed by Harald Anlauf <anlauf@gmx.de>
!
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" } }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment