diff mbox series

PR fortran/61765 -- Avoid ENTRY names in check of repeditive symbols

Message ID 20190112043422.GA75319@troutmask.apl.washington.edu
State New
Headers show
Series PR fortran/61765 -- Avoid ENTRY names in check of repeditive symbols | expand

Commit Message

Steve Kargl Jan. 12, 2019, 4:34 a.m. UTC
The attached patch has been tested on x86_64-*-freebsd.   There
were no regression.  The patch is less then obvious, but simple.
OK to commit?

2019-01-11  Steven G. Kargl  <kargl@gcc.gnu.org>

	PR fortran/61765
	* resolve.c (gfc_verify_binding_labels): Break if-elseif-elseif structure into independent
	if's with a return to simplify logic.  Avoid a check for ENTRY name with bind(c).

2019-01-11  Steven G. Kargl  <kargl@gcc.gnu.org>

	PR fortran/61765
	* gfortran.dg/pr61765.f90: New test.

Comments

Paul Richard Thomas Jan. 12, 2019, 11:14 a.m. UTC | #1
Hi Steve,

This is OK for trunk.

Thanks

Paul

On Sat, 12 Jan 2019 at 04:34, Steve Kargl
<sgk@troutmask.apl.washington.edu> wrote:
>
> The attached patch has been tested on x86_64-*-freebsd.   There
> were no regression.  The patch is less then obvious, but simple.
> OK to commit?
>
> 2019-01-11  Steven G. Kargl  <kargl@gcc.gnu.org>
>
>         PR fortran/61765
>         * resolve.c (gfc_verify_binding_labels): Break if-elseif-elseif structure into independent
>         if's with a return to simplify logic.  Avoid a check for ENTRY name with bind(c).
>
> 2019-01-11  Steven G. Kargl  <kargl@gcc.gnu.org>
>
>         PR fortran/61765
>         * gfortran.dg/pr61765.f90: New test.
>
> --
> Steve
diff mbox series

Patch

Index: gcc/fortran/resolve.c
===================================================================
--- gcc/fortran/resolve.c	(revision 267862)
+++ gcc/fortran/resolve.c	(working copy)
@@ -11789,11 +11789,12 @@  gfc_verify_binding_labels (gfc_symbol *sym)
 		 sym->binding_label, &sym->declared_at, &gsym->where);
       /* Clear the binding label to prevent checking multiple times.  */
       sym->binding_label = NULL;
-
+      return;
     }
-  else if (sym->attr.flavor == FL_VARIABLE && module
-	   && (strcmp (module, gsym->mod_name) != 0
-	       || strcmp (sym->name, gsym->sym_name) != 0))
+
+  if (sym->attr.flavor == FL_VARIABLE && module
+      && (strcmp (module, gsym->mod_name) != 0
+	  || strcmp (sym->name, gsym->sym_name) != 0))
     {
       /* This can only happen if the variable is defined in a module - if it
 	 isn't the same module, reject it.  */
@@ -11802,14 +11803,16 @@  gfc_verify_binding_labels (gfc_symbol *sym)
 		 sym->name, module, sym->binding_label,
 		 &sym->declared_at, &gsym->where, gsym->mod_name);
       sym->binding_label = NULL;
+      return;
     }
-  else if ((sym->attr.function || sym->attr.subroutine)
-	   && ((gsym->type != GSYM_SUBROUTINE && gsym->type != GSYM_FUNCTION)
-	       || (gsym->defined && sym->attr.if_source != IFSRC_IFBODY))
-	   && sym != gsym->ns->proc_name
-	   && (module != gsym->mod_name
-	       || strcmp (gsym->sym_name, sym->name) != 0
-	       || (module && strcmp (module, gsym->mod_name) != 0)))
+
+  if ((sym->attr.function || sym->attr.subroutine)
+      && ((gsym->type != GSYM_SUBROUTINE && gsym->type != GSYM_FUNCTION)
+	   || (gsym->defined && sym->attr.if_source != IFSRC_IFBODY))
+      && (sym != gsym->ns->proc_name && sym->attr.entry == 0)
+      && (module != gsym->mod_name
+	  || strcmp (gsym->sym_name, sym->name) != 0
+	  || (module && strcmp (module, gsym->mod_name) != 0)))
     {
       /* Print an error if the procedure is defined multiple times; we have to
 	 exclude references to the same procedure via module association or
Index: gcc/testsuite/gfortran.dg/pr61765.f90
===================================================================
--- gcc/testsuite/gfortran.dg/pr61765.f90	(nonexistent)
+++ gcc/testsuite/gfortran.dg/pr61765.f90	(working copy)
@@ -0,0 +1,15 @@ 
+! { dg-do compile }
+   subroutine sub1(x)
+     integer, intent(in) :: x
+     entry sub1_c(x) bind(c)
+   end subroutine sub1
+
+   subroutine sub2_c(x) bind(c)
+     integer, intent(in) :: x
+     entry sub2(x)
+   end subroutine sub2_c
+
+   subroutine sub3_c(x) bind(c)
+     integer, intent(in) :: x
+     entry sub3_c_c(x) bind(c)
+   end subroutine sub3_c