re PR fortran/30514 ([4.1 only] zero-sized array wrongly rejected: integer :: i(1...
authorPaul Thomas <pault@gcc.gnu.org>
Sat, 3 Feb 2007 13:38:42 +0000 (13:38 +0000)
committerPaul Thomas <pault@gcc.gnu.org>
Sat, 3 Feb 2007 13:38:42 +0000 (13:38 +0000)
2007-02-03  Paul Thomas  <pault@gcc.gnu.org>

PR fortran/30514
* array.c (match_array_element_spec): If the length of an array is
negative, adjust the upper limit to make it zero length.

PR fortran/30660
* resolve.c (pure_function, resolve_function): Initialize name to
null to clear up build warnings.
(resolve_fl_variable): Look at components explicitly to check for
default initializer, rather than using gfc_default_initializer.

2007-02-03  Paul Thomas  <pault@gcc.gnu.org>

PR fortran/30514
* gfortran.dg/zero_sized_2.f90: New test.

PR fortran/30660
* gfortran.dg/alloc_comp_basics_4.f90: New test.

PR fortran/29820
* gfortran.dg/actual_array_interface_1.f90: Copy source to empty
file.

From-SVN: r121541

gcc/fortran/ChangeLog
gcc/fortran/array.c
gcc/fortran/resolve.c
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/actual_array_interface_1.f90
gcc/testsuite/gfortran.dg/alloc_comp_basics_4.f90 [new file with mode: 0644]
gcc/testsuite/gfortran.dg/zero_sized_2.f90 [new file with mode: 0644]

index 0b256742474c9c70e14f28d42a0f735bd16329b7..18832883b4b80367a2e5add9502d7e71c5bceeb0 100644 (file)
@@ -1,3 +1,15 @@
+2007-02-03  Paul Thomas  <pault@gcc.gnu.org>
+
+       PR fortran/30514
+       * array.c (match_array_element_spec): If the length of an array is
+       negative, adjust the upper limit to make it zero length.
+
+       PR fortran/30660
+       * resolve.c (pure_function, resolve_function): Initialize name to
+       null to clear up build warnings.
+       (resolve_fl_variable): Look at components explicitly to check for
+       default initializer, rather than using gfc_default_initializer.
+
 2007-02-02  Steven G. Kargl <kargl@gcc.gnu.org>
 
        PR fortran/30683
index 76dee5084045563783fbb0868ce3131e242e26fa..895bccc14d108959a6534a366fbd9e9a4b870f1d 100644 (file)
@@ -319,6 +319,15 @@ match_array_element_spec (gfc_array_spec *as)
   if (m == MATCH_NO)
     return AS_ASSUMED_SHAPE;
 
+  /* If the size is negative in this dimension, set it to zero.  */
+  if ((*lower)->expr_type == EXPR_CONSTANT
+      && (*upper)->expr_type == EXPR_CONSTANT
+      && mpz_cmp ((*upper)->value.integer, (*lower)->value.integer) < 0)
+    {
+      gfc_free_expr (*upper);
+      *upper = gfc_copy_expr (*lower);
+      mpz_sub_ui ((*upper)->value.integer, (*upper)->value.integer, 1);
+    }
   return AS_EXPLICIT;
 }
 
index 41e13b0928f7c65d5ced0eb6bd0f176a89008af2..84d42ee34f30b6e849d9be0ef0d668834d168c75 100644 (file)
@@ -1487,6 +1487,8 @@ pure_function (gfc_expr *e, const char **name)
 {
   int pure;
 
+  *name = NULL;
+
   if (e->symtree != NULL
         && e->symtree->n.sym != NULL
         && e->symtree->n.sym->attr.proc == PROC_ST_FUNCTION)
@@ -1663,6 +1665,7 @@ resolve_function (gfc_expr *expr)
 #undef GENERIC_ID
 
   need_full_assumed_size = temp;
+  name = NULL;
 
   if (!pure_function (expr, &name) && name)
     {
@@ -5534,7 +5537,7 @@ resolve_fl_variable (gfc_symbol *sym, int mp_flag)
   int flag;
   int i;
   gfc_expr *e;
-  gfc_expr *constructor_expr;
+  gfc_component *c;
   const char *auto_save_msg;
 
   auto_save_msg = "automatic object '%s' at %L cannot have the "
@@ -5668,18 +5671,21 @@ resolve_fl_variable (gfc_symbol *sym, int mp_flag)
        }
     }
 
+  /* Do not use gfc_default_initializer to test for a default initializer
+     in the fortran because it generates a hidden default for allocatable
+     components.  */
+  c = NULL;
+  if (sym->ts.type == BT_DERIVED && !(sym->value || flag))
+    for (c = sym->ts.derived->components; c; c = c->next)
+      if (c->initializer)
+      break;
+
   /* 4th constraint in section 11.3:  "If an object of a type for which
      component-initialization is specified (R429) appears in the
      specification-part of a module and does not have the ALLOCATABLE
      or POINTER attribute, the object shall have the SAVE attribute."  */
-
-  constructor_expr = NULL;
-  if (sym->ts.type == BT_DERIVED && !(sym->value || flag))
-    constructor_expr = gfc_default_initializer (&sym->ts);
-
-  if (sym->ns->proc_name
+  if (c && sym->ns->proc_name
       && sym->ns->proc_name->attr.flavor == FL_MODULE
-      && constructor_expr
       && !sym->ns->save_all && !sym->attr.save
       && !sym->attr.pointer && !sym->attr.allocatable)
     {
index 67b1ae96d691be2fb9bf2e03ccf0240b0c8677c1..89c44414f1b0f2048a1bb8ebb67eabfa6c479172 100644 (file)
@@ -1,3 +1,15 @@
+2007-02-03  Paul Thomas  <pault@gcc.gnu.org>
+
+       PR fortran/30514
+       * gfortran.dg/zero_sized_2.f90: New test.
+
+       PR fortran/30660
+       * gfortran.dg/alloc_comp_basics_4.f90: New test.
+
+       PR fortran/29820
+       * gfortran.dg/actual_array_interface_1.f90: Copy source to empty
+       file.
+
 2007-02-02  Steven G. Kargl  <kargl@gcc.gnu.org>
 
        PR fortran/30683
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..bc020a3468a4c6ba590f1f7213e2b918dd7e1977 100644 (file)
@@ -0,0 +1,27 @@
+! { dg-do compile }
+! Tests the fix for PR29490, in which the creation of the
+! interface expression for the first argument of the call to
+! 'john' would cause an ICE because GFC_TYPE_ARRAY_LBOUND
+! was NULL.
+!
+! Contributed by Philip Mason <pmason@ricardo.com>
+!
+  !---------------------------------
+  program fred
+  !---------------------------------
+  real              :: dezz(1:10)
+  real, allocatable :: jack(:)
+  !
+  allocate(jack(10)); jack = 9.
+  dezz = john(jack,1)
+  print*,'dezz = ',dezz
+
+  contains
+    !---------------------------------
+    function john(t,il)
+    !---------------------------------
+    real  :: t(il:)
+    real  :: john(1:10)
+    john = 10.
+    end function john
+  end
diff --git a/gcc/testsuite/gfortran.dg/alloc_comp_basics_4.f90 b/gcc/testsuite/gfortran.dg/alloc_comp_basics_4.f90
new file mode 100644 (file)
index 0000000..c910b70
--- /dev/null
@@ -0,0 +1,19 @@
+! { dg-do compile }
+! Tests the fix for PR30660 in which gfortran insisted that g_dest
+! should have the SAVE attribute because the hidden default
+! initializer for the allocatable component was being detected.
+!
+! Contributed by Toon Moene <toon@moene.indiv.nluug.nl>
+!
+MODULE types_m
+  TYPE grib_t
+    REAL,DIMENSION(:),ALLOCATABLE :: vdata
+  END TYPE
+END MODULE
+
+MODULE globals_m
+  USE types_m
+  TYPE(grib_t) g_dest           ! output field
+END MODULE
+! { dg-final { cleanup-modules "types_m globals_m" } }
+
diff --git a/gcc/testsuite/gfortran.dg/zero_sized_2.f90 b/gcc/testsuite/gfortran.dg/zero_sized_2.f90
new file mode 100644 (file)
index 0000000..eda2de2
--- /dev/null
@@ -0,0 +1,13 @@
+! { dg-do compile }
+! Tests the fix for PR30514 in which the bounds on m would cause an
+! error and the rest would cause the compiler to go into an infinite
+! loop.
+! Contributed by Tobias Burnus <burnus@gcc.gnu.org>
+!
+integer :: i(2:0), j(1:0), m(1:-1)
+integer, parameter :: k(2:0) = 0, l(1:0) = 0
+i = k
+j = l
+m = 5
+end
+