diff mbox

[PR,fortran/77260] Patch

Message ID 20160816192527.GA24292@troutmask.apl.washington.edu
State New
Headers show

Commit Message

Steve Kargl Aug. 16, 2016, 7:25 p.m. UTC
If no one objects before Saturday, I will commit the following patch.

2016-08-20  Steven G. Kargl  <kargl@gcc.gnu.org>

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

2016-08-20  Steven G. Kargl  <kargl@gcc.gnu.org>

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

Comments

Paul Richard Thomas Aug. 16, 2016, 10:05 p.m. UTC | #1
Hi Steve,

Far from objecting, the patch is OK to apply before Saturday :-)

Thanks for the patch.

Paul

On 16 August 2016 at 21:25, Steve Kargl
<sgk@troutmask.apl.washington.edu> wrote:
> If no one objects before Saturday, I will commit the following patch.
>
> 2016-08-20  Steven G. Kargl  <kargl@gcc.gnu.org>
>
>         PR fortran/77260
>         * trans-decl.c(generate_local_decl): Suppress warning
>         for unused variable if symbol is entry point.
>
> 2016-08-20  Steven G. Kargl  <kargl@gcc.gnu.org>
>
>         PR fortran/77260
>         * gfortran.dg/pr77260_1.f90: New test.
>         * gfortran.dg/pr77260_2.f90: Ditto.
>
> Index: gcc/fortran/trans-decl.c
> ===================================================================
> --- gcc/fortran/trans-decl.c    (revision 239293)
> +++ gcc/fortran/trans-decl.c    (working copy)
> @@ -5319,9 +5319,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: gcc/testsuite/gfortran.dg/pr77260_1.f90
> ===================================================================
> --- gcc/testsuite/gfortran.dg/pr77260_1.f90     (nonexistent)
> +++ gcc/testsuite/gfortran.dg/pr77260_1.f90     (working copy)
> @@ -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" } }
> Index: gcc/testsuite/gfortran.dg/pr77260_2.f90
> ===================================================================
> --- gcc/testsuite/gfortran.dg/pr77260_2.f90     (nonexistent)
> +++ gcc/testsuite/gfortran.dg/pr77260_2.f90     (working copy)
> @@ -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" } }
> --
> Steve
diff mbox

Patch

Index: gcc/fortran/trans-decl.c
===================================================================
--- gcc/fortran/trans-decl.c	(revision 239293)
+++ gcc/fortran/trans-decl.c	(working copy)
@@ -5319,9 +5319,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: gcc/testsuite/gfortran.dg/pr77260_1.f90
===================================================================
--- gcc/testsuite/gfortran.dg/pr77260_1.f90	(nonexistent)
+++ gcc/testsuite/gfortran.dg/pr77260_1.f90	(working copy)
@@ -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" } }
Index: gcc/testsuite/gfortran.dg/pr77260_2.f90
===================================================================
--- gcc/testsuite/gfortran.dg/pr77260_2.f90	(nonexistent)
+++ gcc/testsuite/gfortran.dg/pr77260_2.f90	(working copy)
@@ -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" } }