]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
backport: re PR fortran/71067 (ICE on data initialization with insufficient value)
authorSteven G. Kargl <kargl@gcc.gnu.org>
Thu, 29 Sep 2016 19:34:59 +0000 (19:34 +0000)
committerSteven G. Kargl <kargl@gcc.gnu.org>
Thu, 29 Sep 2016 19:34:59 +0000 (19:34 +0000)
2016-09-29  Steven G. Kargl  <kargl@gcc.gnu.org>

Backport from trunk
PR fortran/71067
* decl.c (match_data_constant): On error, set 'result' to NULL.

PR fortran/77260
* gcc/fortran/trans-decl.c (generate_local_decl): Suppress warning
for unused variable if symbol is entry point.

2016-09-29  Steven G. Kargl  <kargl@gcc.gnu.org>

Backport from trunk
PR fortran/71067
* gfortran.dg/pr71067_1.f90: New test.
* gfortran.dg/pr71067_2.f90: Ditto.

PR fortran/77260
* gfortran.dg/pr77260_1.f90: New test.
* gfortran.dg/pr77260_2.f90: Ditto.

From-SVN: r240635

gcc/fortran/ChangeLog
gcc/fortran/decl.c
gcc/fortran/trans-decl.c
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/pr71067_1.f90 [new file with mode: 0644]
gcc/testsuite/gfortran.dg/pr71067_2.f90 [new file with mode: 0644]
gcc/testsuite/gfortran.dg/pr77260_1.f90 [new file with mode: 0644]
gcc/testsuite/gfortran.dg/pr77260_2.f90 [new file with mode: 0644]

index 5789f7758ac92c31cc89f90a599dd57357c9ee65..29be78c3eb2e6380b3f7683beb6de6a8ed453a0c 100644 (file)
@@ -1,3 +1,13 @@
+2016-09-29  Steven G. Kargl  <kargl@gcc.gnu.org>
+
+       Backport from trunk
+       PR fortran/71067
+       * decl.c (match_data_constant): On error, set 'result' to NULL.
+
+       PR fortran/77260
+       * gcc/fortran/trans-decl.c (generate_local_decl): Suppress warning
+       for unused variable if symbol is entry point.
+
 2016-09-29  Steven G. Kargl  <kargl@gcc.gnu.org>
 
        Backport from trunk
index d6327189f10cbfec2eb2d322d11b632f03ff1fb9..5c593a94aa2dcb8b9a1a92476d5414b8e412aa70 100644 (file)
@@ -404,6 +404,7 @@ match_data_constant (gfc_expr **result)
     {
       gfc_error ("Symbol %qs must be a PARAMETER in DATA statement at %C",
                 name);
+      *result = NULL;
       return MATCH_ERROR;
     }
   else if (dt_sym && dt_sym->attr.flavor == FL_DERIVED)
index ce077a3f55ce13e97bb870ff452e6fd6d8a5a4b9..d9bb0bc5e84da5e2cbe5ae68528592e6d165d00b 100644 (file)
@@ -5191,9 +5191,19 @@ generate_local_decl (gfc_symbol * sym)
            }
          else if (!sym->attr.use_assoc)
            {
-             gfc_warning (OPT_Wunused_variable,
-                          "Unused variable %qs declared at %L",
-                          sym->name, &sym->declared_at);
+             /* Corner case: the symbol may be an entry point.  At this point,
+                it may appear to be an unused variable.  Suppress warning.  */
+             bool enter = false;
+             gfc_entry_list *el;
+
+             for (el = sym->ns->entries; el; el=el->next)
+               if (strcmp(sym->name, el->sym->name) == 0)
+                 enter = true;
+
+             if (!enter)
+               gfc_warning (OPT_Wunused_variable,
+                            "Unused variable %qs declared at %L",
+                            sym->name, &sym->declared_at);
              if (sym->backend_decl != NULL_TREE)
                TREE_NO_WARNING(sym->backend_decl) = 1;
            }
index 38bc25a47b13a6b213e58369e2465ccd54fbbd7b..f16c2ca4d0cc4e7143f0cf109a35ba10cd8952d5 100644 (file)
@@ -1,3 +1,14 @@
+2016-09-29  Steven G. Kargl  <kargl@gcc.gnu.org>
+
+       Backport from trunk
+       PR fortran/71067
+       * gfortran.dg/pr71067_1.f90: New test.
+       * gfortran.dg/pr71067_2.f90: Ditto.
+
+       PR fortran/77260
+       * gfortran.dg/pr77260_1.f90: New test.
+       * gfortran.dg/pr77260_2.f90: Ditto.
+
 2016-09-29  Steven G. Kargl  <kargl@gcc.gnu.org>
            Louis Krupp      <lkrupp@gcc.gnu.org>
 
diff --git a/gcc/testsuite/gfortran.dg/pr71067_1.f90 b/gcc/testsuite/gfortran.dg/pr71067_1.f90
new file mode 100644 (file)
index 0000000..76fbcfb
--- /dev/null
@@ -0,0 +1,5 @@
+program p
+   integer :: i = 0
+   integer :: z(2)
+   data z /2*i/ ! { dg-error "must be a PARAMETER in DATA" }
+end
diff --git a/gcc/testsuite/gfortran.dg/pr71067_2.f90 b/gcc/testsuite/gfortran.dg/pr71067_2.f90
new file mode 100644 (file)
index 0000000..6fac4c5
--- /dev/null
@@ -0,0 +1,7 @@
+! { dg-do compile }
+program p
+   integer :: a(2), b(2), c(2)
+   data a /2*b1'/ ! { dg-error "must be a PARAMETER in DATA" }
+   data b /2*o1'  ! { dg-error "must be a PARAMETER in DATA" }
+   data c /2*z1   ! { dg-error "must be a PARAMETER in DATA" }
+end
diff --git a/gcc/testsuite/gfortran.dg/pr77260_1.f90 b/gcc/testsuite/gfortran.dg/pr77260_1.f90
new file mode 100644 (file)
index 0000000..0d2ead6
--- /dev/null
@@ -0,0 +1,25 @@
+! { dg-do compile }
+! { dg-options "-Wall" }
+module foo
+
+   implicit none
+
+   private
+   public f1,f2
+
+   contains
+
+      integer function f1()
+         integer f2
+         f1=5
+      entry f2
+         f2=8
+      end function
+end module
+
+program test
+   use foo
+   implicit none
+   print *,f2()
+end program
+! { dg-final { cleanup-modules "foo" } }
diff --git a/gcc/testsuite/gfortran.dg/pr77260_2.f90 b/gcc/testsuite/gfortran.dg/pr77260_2.f90
new file mode 100644 (file)
index 0000000..ea8da4f
--- /dev/null
@@ -0,0 +1,26 @@
+! { dg-do compile }
+! { dg-options "-Wall" }
+module foo
+
+   implicit none
+
+   private
+   public f1,f2
+
+   contains
+
+      integer function f1()
+         integer f2
+         integer f3           ! { dg-warning "Unused variable" }
+         f1=5
+      entry f2
+         f2=8
+      end function
+end module
+
+program test
+   use foo
+   implicit none
+   print *,f2()
+end program
+! { dg-final { cleanup-modules "foo" } }