diff options
| author | fxcoudert <fxcoudert@138bc75d-0d04-0410-961f-82ee72b054a4> | 2007-11-21 18:32:40 +0000 |
|---|---|---|
| committer | fxcoudert <fxcoudert@138bc75d-0d04-0410-961f-82ee72b054a4> | 2007-11-21 18:32:40 +0000 |
| commit | 4516f139f9d98ccf3c8c799befcdc5bb85772e31 (patch) | |
| tree | b686db35b0db0fd1df24395b4a72da636f5547ba | |
| parent | b2ca08ba25c0d0e8b8bc91683f08cbc0d1e70d76 (diff) | |
| download | ppe42-gcc-4516f139f9d98ccf3c8c799befcdc5bb85772e31.tar.gz ppe42-gcc-4516f139f9d98ccf3c8c799befcdc5bb85772e31.zip | |
PR fortran/34083
* resolve.c (resolve_structure_cons): Also check for zero rank.
* gfortran.dg/derived_constructor_comps_2.f90: Add check.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@130332 138bc75d-0d04-0410-961f-82ee72b054a4
| -rw-r--r-- | gcc/fortran/ChangeLog | 5 | ||||
| -rw-r--r-- | gcc/fortran/resolve.c | 8 | ||||
| -rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
| -rw-r--r-- | gcc/testsuite/gfortran.dg/derived_constructor_comps_2.f90 | 12 |
4 files changed, 27 insertions, 3 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index e6e5990fd38..74e5df01bb7 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,8 @@ +2007-11-21 Francois-Xavier Coudert <fxcoudert@gcc.gnu.org> + + PR fortran/34083 + * resolve.c (resolve_structure_cons): Also check for zero rank. + 2007-11-19 Jerry DeLisle <jvdelisle@gcc.gnu.org> PR fortran/33317 diff --git a/gcc/fortran/resolve.c b/gcc/fortran/resolve.c index 6c9856d5f62..c6808eb1f21 100644 --- a/gcc/fortran/resolve.c +++ b/gcc/fortran/resolve.c @@ -742,6 +742,8 @@ resolve_structure_cons (gfc_expr *expr) for (; comp; comp = comp->next, cons = cons->next) { + int rank; + if (!cons->expr) continue; @@ -751,14 +753,14 @@ resolve_structure_cons (gfc_expr *expr) continue; } - if (cons->expr->expr_type != EXPR_NULL - && comp->as && comp->as->rank != cons->expr->rank + rank = comp->as ? comp->as->rank : 0; + if (cons->expr->expr_type != EXPR_NULL && rank != cons->expr->rank && (comp->allocatable || cons->expr->rank)) { gfc_error ("The rank of the element in the derived type " "constructor at %L does not match that of the " "component (%d/%d)", &cons->expr->where, - cons->expr->rank, comp->as ? comp->as->rank : 0); + cons->expr->rank, rank); t = FAILURE; } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 19f65a94ed5..ff241baebf6 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2007-11-21 Francois-Xavier Coudert <fxcoudert@gcc.gnu.org> + + PR fortran/34083 + * gfortran.dg/derived_constructor_comps_2.f90: Add check. + 2007-11-20 Richard Guenther <rguenther@suse.de> PR middle-end/34154 diff --git a/gcc/testsuite/gfortran.dg/derived_constructor_comps_2.f90 b/gcc/testsuite/gfortran.dg/derived_constructor_comps_2.f90 index f69e1006413..ef3005da294 100644 --- a/gcc/testsuite/gfortran.dg/derived_constructor_comps_2.f90 +++ b/gcc/testsuite/gfortran.dg/derived_constructor_comps_2.f90 @@ -13,3 +13,15 @@ marge = homer (duff_beer) ! { dg-error "should be a POINTER or a TARGET" } end +! +! The following yield an ICE, see PR 34083 +! +subroutine foo + type ByteType + character(len=1) :: singleByte + end type + type (ByteType) :: bytes(4) + + print *, size(bytes) + bytes = ByteType((/'H', 'i', '!', ' '/)) ! { dg-error "rank of the element in the derived type constructor" } +end subroutine foo |

