From 241e79cfc4264dec4eaf1e8af890da3527c99193 Mon Sep 17 00:00:00 2001 From: Tobias Burnus Date: Thu, 25 Aug 2011 17:59:40 +0200 Subject: [PATCH] trans-array.c (structure_alloc_comps): Fix for allocatable scalar coarray components. 2011-08-25 Tobias Burnus * trans-array.c (structure_alloc_comps): Fix for allocatable scalar coarray components. * trans-expr.c (gfc_conv_component_ref): Ditto. * trans-type.c (gfc_get_derived_type): Ditto. 2011-08-25 Tobias Burnus * gfortran.dg/coarray/alloc_comp_1.f90: New. From-SVN: r178068 --- gcc/fortran/ChangeLog | 7 +++++++ gcc/fortran/trans-array.c | 6 ++++-- gcc/fortran/trans-expr.c | 3 ++- gcc/fortran/trans-types.c | 2 +- gcc/testsuite/ChangeLog | 4 ++++ .../gfortran.dg/coarray/alloc_comp_1.f90 | 16 ++++++++++++++++ 6 files changed, 34 insertions(+), 4 deletions(-) create mode 100644 gcc/testsuite/gfortran.dg/coarray/alloc_comp_1.f90 diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index ed4dc77f020..1c4a6737f12 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,10 @@ +2011-08-25 Tobias Burnus + + * trans-array.c (structure_alloc_comps): Fix for allocatable + scalar coarray components. + * trans-expr.c (gfc_conv_component_ref): Ditto. + * trans-type.c (gfc_get_derived_type): Ditto. + 2011-08-24 Tobias Burnus PR fortran/50163 diff --git a/gcc/fortran/trans-array.c b/gcc/fortran/trans-array.c index 3a756584933..bd9e88efd3a 100644 --- a/gcc/fortran/trans-array.c +++ b/gcc/fortran/trans-array.c @@ -6798,7 +6798,8 @@ structure_alloc_comps (gfc_symbol * der_type, tree decl, gfc_add_expr_to_block (&fnblock, tmp); } - if (c->attr.allocatable && c->attr.dimension) + if (c->attr.allocatable + && (c->attr.dimension || c->attr.codimension)) { comp = fold_build3_loc (input_location, COMPONENT_REF, ctype, decl, cdecl, NULL_TREE); @@ -6845,7 +6846,8 @@ structure_alloc_comps (gfc_symbol * der_type, tree decl, case NULLIFY_ALLOC_COMP: if (c->attr.pointer) continue; - else if (c->attr.allocatable && c->attr.dimension) + else if (c->attr.allocatable + && (c->attr.dimension|| c->attr.codimension)) { comp = fold_build3_loc (input_location, COMPONENT_REF, ctype, decl, cdecl, NULL_TREE); diff --git a/gcc/fortran/trans-expr.c b/gcc/fortran/trans-expr.c index 39a83ce4da3..531a135c2f4 100644 --- a/gcc/fortran/trans-expr.c +++ b/gcc/fortran/trans-expr.c @@ -564,7 +564,8 @@ gfc_conv_component_ref (gfc_se * se, gfc_ref * ref) se->string_length = tmp; } - if (((c->attr.pointer || c->attr.allocatable) && c->attr.dimension == 0 + if (((c->attr.pointer || c->attr.allocatable) + && (!c->attr.dimension && !c->attr.codimension) && c->ts.type != BT_CHARACTER) || c->attr.proc_pointer) se->expr = build_fold_indirect_ref_loc (input_location, diff --git a/gcc/fortran/trans-types.c b/gcc/fortran/trans-types.c index bec2a116752..bac5b31e9c3 100644 --- a/gcc/fortran/trans-types.c +++ b/gcc/fortran/trans-types.c @@ -2395,7 +2395,7 @@ gfc_get_derived_type (gfc_symbol * derived) /* This returns an array descriptor type. Initialization may be required. */ - if (c->attr.dimension && !c->attr.proc_pointer) + if ((c->attr.dimension || c->attr.codimension) && !c->attr.proc_pointer ) { if (c->attr.pointer || c->attr.allocatable) { diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index eda284a99fb..30b48b4e03d 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2011-08-25 Tobias Burnus + + * gfortran.dg/coarray/alloc_comp_1.f90: New. + 2011-08-25 Richard Guenther * gcc.dg/Wshadow-3.c: Restore original content destroyed by r148442. diff --git a/gcc/testsuite/gfortran.dg/coarray/alloc_comp_1.f90 b/gcc/testsuite/gfortran.dg/coarray/alloc_comp_1.f90 new file mode 100644 index 00000000000..6baeabf251b --- /dev/null +++ b/gcc/testsuite/gfortran.dg/coarray/alloc_comp_1.f90 @@ -0,0 +1,16 @@ +! { dg-do run } +! +! Allocatable scalar corrays were mishandled (ICE) +! +type t + integer, allocatable :: caf[:] +end type t +type(t) :: a +allocate (a%caf[3:*]) +a%caf = 7 +!print *, a%caf +if (a%caf /= 7) call abort () +if (any (lcobound (a%caf) /= [ 3 ]) & + .or. ucobound (a%caf, dim=1) /= this_image ()+2) & + call abort () +end -- 2.30.2