re PR fortran/45521 ([F08] GENERIC resolution with ALLOCATABLE/POINTER and PROCEDURE)
authorJanus Weil <janus@gcc.gnu.org>
Sat, 4 Aug 2018 15:37:23 +0000 (17:37 +0200)
committerJanus Weil <janus@gcc.gnu.org>
Sat, 4 Aug 2018 15:37:23 +0000 (17:37 +0200)
2018-08-04  Janus Weil  <janus@gcc.gnu.org>

PR fortran/45521
* interface.c (gfc_compare_interfaces): Apply additional
distinguishability criteria of F08 to operator interfaces.

2018-08-04  Janus Weil  <janus@gcc.gnu.org>

PR fortran/45521
* gfortran.dg/interface_assignment_6.f90: New test case.

From-SVN: r263308

gcc/fortran/ChangeLog
gcc/fortran/interface.c
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/interface_assignment_6.f90 [new file with mode: 0644]

index 9454102afdbf78ed4c7552f054abf2df18218d3d..ced9c9146f250e2c437dce10be49e57fb6415b0f 100644 (file)
@@ -1,3 +1,9 @@
+2018-08-04  Janus Weil  <janus@gcc.gnu.org>
+
+       PR fortran/45521
+       * interface.c (gfc_compare_interfaces): Apply additional
+       distinguishability criteria of F08 to operator interfaces.
+
 2018-07-31  Andre Vieira  <andre.simoesdiasvieira@arm.com>
 
        Revert 'AsyncI/O patch committed'
index 9da654e65d5d3830a9bade041e1915afe3a41f51..32aae0eda5515e79fb13aaebc70e90d84fb64277 100644 (file)
@@ -1776,7 +1776,7 @@ gfc_compare_interfaces (gfc_symbol *s1, gfc_symbol *s2, const char *name2,
          }
        else
          {
-           /* Only check type and rank.  */
+           /* Operators: Only check type and rank of arguments.  */
            if (!compare_type (f2->sym, f1->sym))
              {
                if (errmsg != NULL)
@@ -1794,6 +1794,15 @@ gfc_compare_interfaces (gfc_symbol *s1, gfc_symbol *s2, const char *name2,
                            symbol_rank (f2->sym));
                return false;
              }
+           if ((gfc_option.allow_std & GFC_STD_F2008)
+               && (compare_ptr_alloc(f1->sym, f2->sym)
+                   || compare_ptr_alloc(f2->sym, f1->sym)))
+             {
+               if (errmsg != NULL)
+                 snprintf (errmsg, err_len, "Mismatching POINTER/ALLOCATABLE "
+                           "attribute in argument '%s' ", f1->sym->name);
+               return false;
+             }
          }
       }
 
index 551400cb0d493e9458027cb72180005c6951f8d6..278ea3d98bf167ea92f77eb49a6d8e539b8c0564 100644 (file)
@@ -1,3 +1,9 @@
+
+2018-08-04  Janus Weil  <janus@gcc.gnu.org>
+
+       PR fortran/45521
+       * gfortran.dg/interface_assignment_6.f90: New test case.
+
 2018-08-04  Uros Bizjak  <ubizjak@gmail.com>
 
        PR testsuite/86153
diff --git a/gcc/testsuite/gfortran.dg/interface_assignment_6.f90 b/gcc/testsuite/gfortran.dg/interface_assignment_6.f90
new file mode 100644 (file)
index 0000000..81171b4
--- /dev/null
@@ -0,0 +1,30 @@
+! { dg-do compile }
+!
+! PR 45521: [F08] GENERIC resolution with ALLOCATABLE/POINTER and PROCEDURE
+!
+! Contributed by Janus Weil <janus@gcc.gnu.org>
+
+module inteface_assignment_6
+
+  type :: t
+  end type
+
+  ! this was rejected as ambiguous, but is valid in F08
+  interface assignment(=)
+    procedure testAlloc
+    procedure testPtr
+  end interface
+
+contains
+
+  subroutine testAlloc(obj, val)
+    type(t), allocatable, intent(out) :: obj
+    integer, intent(in) :: val
+  end subroutine
+
+  subroutine testPtr(obj, val)
+    type(t), pointer, intent(out) :: obj
+    integer, intent(in) :: val
+  end subroutine
+
+end