re PR fortran/51652 (Allocate with type-spec and source-expr: check whether length type-parameter is the same is lacking)

2012-01-10  Tobias Burnus  <burnus@net-b.de>

        PR fortran/51652
        * resolve.c (resolve_allocate_expr): For non-deferred char
        lengths, check whether type-spec matches declaration.

2012-01-10  Tobias Burnus  <burnus@net-b.de>

        PR fortran/51652
        * gfortran.dg/allocate_with_typespec_5.f90: New.

From-SVN: r183061
This commit is contained in:
Tobias Burnus 2012-01-10 12:22:16 +01:00 committed by Tobias Burnus
parent c9423ca3fa
commit 2e0bffaf8c
4 changed files with 50 additions and 0 deletions

View File

@ -1,3 +1,9 @@
2012-01-10 Tobias Burnus <burnus@net-b.de>
PR fortran/51652
* resolve.c (resolve_allocate_expr): For non-deferred char lengths,
check whether type-spec matches declaration.
2012-01-10 Tobias Burnus <burnus@net-b.de>
* resolve.c (resolve_ordinary_assign): Improve error wording.

View File

@ -6989,6 +6989,19 @@ resolve_allocate_expr (gfc_expr *e, gfc_code *code)
goto failure;
}
if (code->ext.alloc.ts.type == BT_CHARACTER && !e->ts.deferred)
{
int cmp = gfc_dep_compare_expr (e->ts.u.cl->length,
code->ext.alloc.ts.u.cl->length);
if (cmp == 1 || cmp == -1 || cmp == -3)
{
gfc_error ("Allocating %s at %L with type-spec requires the same "
"character-length parameter as in the declaration",
sym->name, &e->where);
goto failure;
}
}
/* In the variable definition context checks, gfc_expr_attr is used
on the expression. This is fooled by the array specification
present in e, thus we have to eliminate that one temporarily. */

View File

@ -1,3 +1,8 @@
2012-01-10 Tobias Burnus <burnus@net-b.de>
PR fortran/51652
* gfortran.dg/allocate_with_typespec_5.f90: New.
2012-01-10 Tobias Burnus <burnus@net-b.de>
* gfortran.dg/class_39.f03: Update dg-error string.

View File

@ -0,0 +1,26 @@
! { dg-do compile }
!
! PR fortran/51652
!
! Contributed by David Kinniburgh
!
module settings
type keyword
character(60), allocatable :: c(:)
end type keyword
type(keyword) :: kw(10)
contains
subroutine save_kw
allocate(character(80) :: kw(1)%c(10)) ! { dg-error "with type-spec requires the same character-length parameter" }
end subroutine save_kw
subroutine foo(n)
character(len=n+2), allocatable :: x
allocate (character(len=n+3) :: x) ! { dg-error "type-spec requires the same character-length parameter" }
end subroutine foo
end module settings