re PR fortran/51652 (Allocate with type-spec and source-expr: check whether length...
authorTobias Burnus <burnus@net-b.de>
Tue, 10 Jan 2012 11:22:16 +0000 (12:22 +0100)
committerTobias Burnus <burnus@gcc.gnu.org>
Tue, 10 Jan 2012 11:22:16 +0000 (12:22 +0100)
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

gcc/fortran/ChangeLog
gcc/fortran/resolve.c
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/allocate_with_typespec_5.f90 [new file with mode: 0644]

index bc9abc1f1755d404abeedc6fc1c046dc00d1617c..04c8344870524c8c2bbf4a7dfe5b368d1a9dea41 100644 (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.
index 1c5fea3752c0d5be04909824c366bfba577df593..7f476b8340085b3e7d7908a739c8e16a203d7e24 100644 (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.  */
index a6df9b0fc3331bdfbaf4d135768963c9e3efd274..1eccbaa7c17e91a3d820123a27df39282ec5790b 100644 (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.
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 (file)
index 0000000..1f8b3d6
--- /dev/null
@@ -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