aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorTobias Burnus <burnus@net-b.de>2012-01-10 12:22:16 +0100
committerTobias Burnus <burnus@gcc.gnu.org>2012-01-10 12:22:16 +0100
commit2e0bffaf8cc85cd8f5dd4a7b31ca354e0017b14e (patch)
tree6f2b9158f3eb1e9ffed7f3460c26bf0112f5d24c /gcc
parentc9423ca3fa65282b0ca58d33976c150f78e24f23 (diff)
downloadgcc-2e0bffaf8cc85cd8f5dd4a7b31ca354e0017b14e.zip
gcc-2e0bffaf8cc85cd8f5dd4a7b31ca354e0017b14e.tar.gz
gcc-2e0bffaf8cc85cd8f5dd4a7b31ca354e0017b14e.tar.bz2
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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/fortran/ChangeLog6
-rw-r--r--gcc/fortran/resolve.c13
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gfortran.dg/allocate_with_typespec_5.f9026
4 files changed, 50 insertions, 0 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index bc9abc1..04c8344 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -1,5 +1,11 @@
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.
2012-01-09 Paul Thomas <pault@gcc.gnu.org>
diff --git a/gcc/fortran/resolve.c b/gcc/fortran/resolve.c
index 1c5fea3..7f476b8 100644
--- a/gcc/fortran/resolve.c
+++ b/gcc/fortran/resolve.c
@@ -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. */
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index a6df9b0..1eccbaa 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,5 +1,10 @@
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.
2012-01-10 Richard Guenther <rguenther@suse.de>
diff --git a/gcc/testsuite/gfortran.dg/allocate_with_typespec_5.f90 b/gcc/testsuite/gfortran.dg/allocate_with_typespec_5.f90
new file mode 100644
index 0000000..1f8b3d6
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/allocate_with_typespec_5.f90
@@ -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