A rather simple patch.
Build and regtested on x86-64-linux.
OK for the trunk?
I think that is the last patch required for commonly used code.
Remaining are issues with array constructors and concatenations - and,
of course, deferred-length components.
Tobias
2012-05-15 Tobias Burnus bur...@net-b.de
PR fortran/51055
PR fortran/45170
* match.c (gfc_match_allocate): Set length_from_typespec
for characters.
* resolve.c (resolve_charlen): If set, don't check whether
the len is a specification expression.
2012-05-15 Tobias Burnus bur...@net-b.de
PR fortran/51055
PR fortran/45170
* gfortran.dg/allocate_with_typespec_6.f90: New.
diff --git a/gcc/fortran/match.c b/gcc/fortran/match.c
index 3d11918..93d7fab 100644
--- a/gcc/fortran/match.c
+++ b/gcc/fortran/match.c
@@ -3466,6 +3466,9 @@ gfc_match_allocate (void)
type parameter, old_locus);
goto cleanup;
}
+
+ if (ts.type == BT_CHARACTER)
+ ts.u.cl-length_from_typespec = true;
}
else
{
diff --git a/gcc/fortran/resolve.c b/gcc/fortran/resolve.c
index 9814c14..6fd2d97 100644
--- a/gcc/fortran/resolve.c
+++ b/gcc/fortran/resolve.c
@@ -9945,12 +9945,24 @@ resolve_charlen (gfc_charlen *cl)
cl-resolved = 1;
- specification_expr = 1;
- if (resolve_index_expr (cl-length) == FAILURE)
+ if (cl-length_from_typespec)
{
- specification_expr = 0;
- return FAILURE;
+ if (gfc_resolve_expr (cl-length) == FAILURE)
+ return FAILURE;
+
+ if (gfc_simplify_expr (cl-length, 0) == FAILURE)
+ return FAILURE;
+}
+ else
+{
+ specification_expr = 1;
+
+ if (resolve_index_expr (cl-length) == FAILURE)
+ {
+ specification_expr = 0;
+ return FAILURE;
+ }
}
/* If the character length parameter value evaluates to a negative
--- /dev/null 2012-05-14 08:15:48.907781309 +0200
+++ gcc/gcc/testsuite/gfortran.dg/allocate_with_typespec_6.f90 2012-05-15 09:50:53.0 +0200
@@ -0,0 +1,17 @@
+! { dg-do compile }
+!
+! PR fortran/51055
+! PR fortran/45170 comment 14
+!
+! Contributed by Juha Ruokolainen
+! and Hans-Werner Boschmann
+!
+! gfortran was before checking whether the length
+! was a specification expression.
+!
+
+program a
+ character(len=:), allocatable :: s
+ integer :: i=10
+ allocate(character(len=i)::s)
+end program a