gcc/fortran/
authorjanus <janus@138bc75d-0d04-0410-961f-82ee72b054a4>
Sun, 17 Jan 2010 13:33:11 +0000 (13:33 +0000)
committerjanus <janus@138bc75d-0d04-0410-961f-82ee72b054a4>
Sun, 17 Jan 2010 13:33:11 +0000 (13:33 +0000)
2010-01-17  Janus Weil  <janus@gcc.gnu.org>

PR fortran/42677
* gfortran.h (symbol_attribute): Remove 'ambiguous_interfaces'.
* interface.c (check_interface1): Move a warning message here from
resolve_fl_procedure.
(check_sym_interfaces): Removed 'attr.ambiguous_interfaces'.
* module.c (read_module): Remove call to gfc_check_interfaces, since
this comes too early here.
* resolve.c (resolve_fl_procedure): Move warning message to
check_interface1.

gcc/testsuite/
2010-01-17  Janus Weil  <janus@gcc.gnu.org>

PR fortran/42677
* gfortran.dg/interface_assignment_5.f90: New test.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@155979 138bc75d-0d04-0410-961f-82ee72b054a4

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

index af85555..b2741b1 100644 (file)
@@ -1,3 +1,15 @@
+2010-01-17  Janus Weil  <janus@gcc.gnu.org>
+
+       PR fortran/42677
+       * gfortran.h (symbol_attribute): Remove 'ambiguous_interfaces'.
+       * interface.c (check_interface1): Move a warning message here from
+       resolve_fl_procedure.
+       (check_sym_interfaces): Removed 'attr.ambiguous_interfaces'.
+       * module.c (read_module): Remove call to gfc_check_interfaces, since
+       this comes too early here.
+       * resolve.c (resolve_fl_procedure): Move warning message to
+       check_interface1.
+
 2010-01-14 Jerry DeLisle <jvdelisle@gcc.gnu.org>
 
        PR fortran/42684
index 345a701..320de83 100644 (file)
@@ -714,9 +714,6 @@ typedef struct
      modification of type or type parameters is permitted.  */
   unsigned referenced:1;
 
-  /* Set if the symbol has ambiguous interfaces.  */
-  unsigned ambiguous_interfaces:1;
-
   /* Set if this is the symbol for the main program.  */
   unsigned is_main_program:1;
 
index 2a5ece1..f27d75c 100644 (file)
@@ -1132,16 +1132,16 @@ check_interface1 (gfc_interface *p, gfc_interface *q0,
                                    NULL, 0))
          {
            if (referenced)
-             {
-               gfc_error ("Ambiguous interfaces '%s' and '%s' in %s at %L",
-                          p->sym->name, q->sym->name, interface_name,
-                          &p->where);
-             }
-
-           if (!p->sym->attr.use_assoc && q->sym->attr.use_assoc)
+             gfc_error ("Ambiguous interfaces '%s' and '%s' in %s at %L",
+                        p->sym->name, q->sym->name, interface_name,
+                        &p->where);
+           else if (!p->sym->attr.use_assoc && q->sym->attr.use_assoc)
              gfc_warning ("Ambiguous interfaces '%s' and '%s' in %s at %L",
                           p->sym->name, q->sym->name, interface_name,
                           &p->where);
+           else
+             gfc_warning ("Although not referenced, '%s' has ambiguous "
+                          "interfaces at %L", interface_name, &p->where);
            return 1;
          }
       }
@@ -1157,7 +1157,6 @@ static void
 check_sym_interfaces (gfc_symbol *sym)
 {
   char interface_name[100];
-  bool k;
   gfc_interface *p;
 
   if (sym->ns != gfc_current_ns)
@@ -1184,9 +1183,8 @@ check_sym_interfaces (gfc_symbol *sym)
       /* Originally, this test was applied to host interfaces too;
         this is incorrect since host associated symbols, from any
         source, cannot be ambiguous with local symbols.  */
-      k = sym->attr.referenced || !sym->attr.use_assoc;
-      if (check_interface1 (sym->generic, sym->generic, 1, interface_name, k))
-       sym->attr.ambiguous_interfaces = 1;
+      check_interface1 (sym->generic, sym->generic, 1, interface_name,
+                       sym->attr.referenced || !sym->attr.use_assoc);
     }
 }
 
index 667bab8..13c9b82 100644 (file)
@@ -4482,8 +4482,6 @@ read_module (void)
                 module_name);
     }
 
-  gfc_check_interfaces (gfc_current_ns);
-
   /* Now we should be in a position to fill f2k_derived with derived type
      extensions, since everything has been loaded.  */
   set_module_locus (&extensions);
index 9212521..6bc5fde 100644 (file)
@@ -9077,10 +9077,6 @@ resolve_fl_procedure (gfc_symbol *sym, int mp_flag)
 {
   gfc_formal_arglist *arg;
 
-  if (sym->attr.ambiguous_interfaces && !sym->attr.referenced)
-    gfc_warning ("Although not referenced, '%s' at %L has ambiguous "
-                "interfaces", sym->name, &sym->declared_at);
-
   if (sym->attr.function
       && resolve_fl_var_and_proc (sym, mp_flag) == FAILURE)
     return FAILURE;
index 5272d3d..f92f6c5 100644 (file)
@@ -1,3 +1,8 @@
+2010-01-17  Janus Weil  <janus@gcc.gnu.org>
+
+       PR fortran/42677
+       * gfortran.dg/interface_assignment_5.f90: New test.
+
 2010-01-17  Dodji Seketeli  <dodji@redhat.com>
 
        PR c++/42697
diff --git a/gcc/testsuite/gfortran.dg/interface_assignment_5.f90 b/gcc/testsuite/gfortran.dg/interface_assignment_5.f90
new file mode 100644 (file)
index 0000000..8444dd0
--- /dev/null
@@ -0,0 +1,49 @@
+! { dg-do compile }
+!
+! PR 42677: [4.5 Regression] Bogus Error: Ambiguous interfaces '...' in intrinsic assignment operator
+!
+! Contributed by Harald Anlauf <anlauf@gmx.de>
+
+module mod1
+  implicit none
+  type t_m
+     integer :: i = 0
+  end type t_m
+!------------------------------------------------------------------------------
+  interface assignment (=)
+     module procedure assign_m
+  end interface
+!------------------------------------------------------------------------------
+contains
+  subroutine assign_m (y, x)
+    type(t_m) ,intent(inout) :: y
+    type(t_m) ,intent(in)    :: x
+  end subroutine assign_m
+end module mod1
+!==============================================================================
+module mod2
+  use mod1, only: t_m, assignment(=)
+  implicit none
+  type t_atm
+     integer :: k
+  end type t_atm
+!------------------------------------------------------------------------------
+  interface assignment(=)
+     module procedure assign_to_atm
+  end interface
+!------------------------------------------------------------------------------
+  interface
+     pure subroutine delete_m (x)
+       use mod1
+       type(t_m) ,intent(in) :: x
+     end subroutine delete_m
+  end interface
+!------------------------------------------------------------------------------
+contains
+  subroutine assign_to_atm (atm, r)
+    type(t_atm) ,intent(inout) :: atm
+    integer     ,intent(in)    :: r
+  end subroutine assign_to_atm
+end module mod2
+! { dg-final { cleanup-modules "mod1 mod2" } }