Fix regression introduced at revision 221586.
authorMikael Morin <mikael@gcc.gnu.org>
Wed, 25 Mar 2015 10:15:46 +0000 (10:15 +0000)
committerMikael Morin <mikael@gcc.gnu.org>
Wed, 25 Mar 2015 10:15:46 +0000 (10:15 +0000)
PR fortran/64952
PR fortran/65532
fortran/
* gfortran.h (struct gfc_namespace): New field 'types_resolved'.
* resolve.c (resolve_types): Return early if field 'types_resolved'
is set.  Set 'types_resolved' at the end.
testsuite/
* gfortran.dg/data_initialized_3.f90: New.

From-SVN: r221657

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

index 7c330c7ec213aaac237ad1168eb73541eb981803..fb3a83d83d3f48c3a2369f6312c63f7e98edce69 100644 (file)
@@ -1,3 +1,11 @@
+2015-03-25  Mikael Morin  <mikael@gcc.gnu.org>
+
+       PR fortran/64952
+       PR fortran/65532
+       * gfortran.h (struct gfc_namespace): New field 'types_resolved'.
+       * resolve.c (resolve_types): Return early if field 'types_resolved'
+       is set.  Set 'types_resolved' at the end.
+
 2015-03-24  Andre Vehreschild  <vehre@gmx.de>
 
        PR fortran/55901
index 8e6595f1cc4f03ba9cf68be4335646bd768fd244..24d56c08b7ab07f4ca4482f45684fecf4497bc56 100644 (file)
@@ -1691,6 +1691,9 @@ typedef struct gfc_namespace
      Holds -1 during resolution.  */
   signed resolved:2;
 
+  /* Set when resolve_types has been called for this namespace.  */
+  unsigned types_resolved:1;
+
   /* Set to 1 if code has been generated for this namespace.  */
   unsigned translated:1;
 
index 2a24dfd8edab63c3fe2beb57a4d7c35fcb064bf2..316b413d756e714b792be61d575db9b6fc65d5fd 100644 (file)
@@ -14942,6 +14942,9 @@ resolve_types (gfc_namespace *ns)
   gfc_equiv *eq;
   gfc_namespace* old_ns = gfc_current_ns;
 
+  if (ns->types_resolved)
+    return;
+
   /* Check that all IMPLICIT types are ok.  */
   if (!ns->seen_implicit_none)
     {
@@ -15016,6 +15019,8 @@ resolve_types (gfc_namespace *ns)
 
   gfc_resolve_omp_udrs (ns->omp_udr_root);
 
+  ns->types_resolved = 1;
+
   gfc_current_ns = old_ns;
 }
 
index fe8092a8e63ebe8461c49e494d3182fe8b77fdad..cf3b288b06452d333e3ead592e609a5b7a7380cc 100644 (file)
@@ -1,3 +1,9 @@
+2015-03-25  Mikael Morin  <mikael@gcc.gnu.org>
+
+       PR fortran/64952
+       PR fortran/65532
+       * gfortran.dg/data_initialized_3.f90: New.
+
 2015-03-25  Richard Biener  <rguenther@suse.de>
 
        PR middle-end/65519
diff --git a/gcc/testsuite/gfortran.dg/data_initialized_3.f90 b/gcc/testsuite/gfortran.dg/data_initialized_3.f90
new file mode 100644 (file)
index 0000000..c3ca4b3
--- /dev/null
@@ -0,0 +1,43 @@
+! { dg-do compile }
+!
+! PR fortran/65532
+! The partial initialization through data statements was producing
+! shape mismatch errors.
+!
+! Contributed by Harald Anlauf  <anlauf@gmx.de>
+
+module gfcbug131
+  implicit none
+contains
+  DOUBLE PRECISION FUNCTION d1mach(i)
+    INTEGER, INTENT(IN)         :: i
+
+    INTEGER :: small(4)
+    INTEGER :: large(4)
+    INTEGER :: right(4)
+    INTEGER :: diver(4)
+    INTEGER :: LOG10(4)
+    DOUBLE PRECISION :: dmach(5)
+
+    EQUIVALENCE (dmach(1),small(1))
+    EQUIVALENCE (dmach(2),large(1))
+    EQUIVALENCE (dmach(3),right(1))
+    EQUIVALENCE (dmach(4),diver(1))
+    EQUIVALENCE (dmach(5),LOG10(1))
+
+    DATA small(1),small(2) /          0,    1048576 /
+    DATA large(1),large(2) /         -1, 2146435071 /
+    DATA right(1),right(2) /          0, 1017118720 /
+    DATA diver(1),diver(2) /          0, 1018167296 /
+    DATA LOG10(1),LOG10(2) / 1352628735, 1070810131 /
+
+    d1mach = dmach(i)
+  END FUNCTION d1mach
+
+  DOUBLE PRECISION FUNCTION foo (x)
+    DOUBLE PRECISION, INTENT(IN) :: x
+    foo = SQRT (d1mach(4))
+  END FUNCTION foo
+
+end module gfcbug131
+