aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorHarald Anlauf <anlauf@gmx.de>2023-10-26 22:32:35 +0200
committerHarald Anlauf <anlauf@gmx.de>2023-10-27 19:17:46 +0200
commitc6430d3e6d3279c7e4be9d189031a17bb3dec347 (patch)
treeb67974696ca8b020ce5023cf87a5d4e3d6d953bd /gcc
parent9f3c4c673d769bd3f1d504d85b743ba250e68d7b (diff)
downloadgcc-c6430d3e6d3279c7e4be9d189031a17bb3dec347.zip
gcc-c6430d3e6d3279c7e4be9d189031a17bb3dec347.tar.gz
gcc-c6430d3e6d3279c7e4be9d189031a17bb3dec347.tar.bz2
Fortran: diagnostics of MODULE PROCEDURE declaration conflicts [PR104649]
gcc/fortran/ChangeLog: PR fortran/104649 * decl.cc (gfc_match_formal_arglist): Handle conflicting declarations of a MODULE PROCEDURE when one of the declarations is an alternate return. gcc/testsuite/ChangeLog: PR fortran/104649 * gfortran.dg/pr104649.f90: New test. Co-authored-by: Steven G. Kargl <kargl@gcc.gnu.org>
Diffstat (limited to 'gcc')
-rw-r--r--gcc/fortran/decl.cc21
-rw-r--r--gcc/testsuite/gfortran.dg/pr104649.f9044
2 files changed, 61 insertions, 4 deletions
diff --git a/gcc/fortran/decl.cc b/gcc/fortran/decl.cc
index bdd3be3..4893c58 100644
--- a/gcc/fortran/decl.cc
+++ b/gcc/fortran/decl.cc
@@ -6796,12 +6796,25 @@ ok:
|| (p->next == NULL && q->next != NULL))
arg_count_mismatch = true;
else if ((p->sym == NULL && q->sym == NULL)
- || strcmp (p->sym->name, q->sym->name) == 0)
+ || (p->sym && q->sym
+ && strcmp (p->sym->name, q->sym->name) == 0))
continue;
else
- gfc_error_now ("Mismatch in MODULE PROCEDURE formal "
- "argument names (%s/%s) at %C",
- p->sym->name, q->sym->name);
+ {
+ if (q->sym == NULL)
+ gfc_error_now ("MODULE PROCEDURE formal argument %qs "
+ "conflicts with alternate return at %C",
+ p->sym->name);
+ else if (p->sym == NULL)
+ gfc_error_now ("MODULE PROCEDURE formal argument is "
+ "alternate return and conflicts with "
+ "%qs in the separate declaration at %C",
+ q->sym->name);
+ else
+ gfc_error_now ("Mismatch in MODULE PROCEDURE formal "
+ "argument names (%s/%s) at %C",
+ p->sym->name, q->sym->name);
+ }
}
if (arg_count_mismatch)
diff --git a/gcc/testsuite/gfortran.dg/pr104649.f90 b/gcc/testsuite/gfortran.dg/pr104649.f90
new file mode 100644
index 0000000..f301ffc
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/pr104649.f90
@@ -0,0 +1,44 @@
+! { dg-do compile }
+! { dg-options "-w" }
+! PR fortran/104649
+! Contributed by G.Steinmetz
+
+module m
+ interface
+ module subroutine s(x)
+ real :: x
+ end
+ end interface
+end
+submodule(m) m2
+contains
+ module subroutine s(*) ! { dg-error "conflicts with alternate return" }
+ end
+end
+
+module n
+ interface
+ module subroutine s(*)
+ end
+ end interface
+end
+submodule(n) n2
+contains
+ module subroutine s(x) ! { dg-error "formal argument is alternate return" }
+ real :: x
+ end
+end
+
+module p
+ interface
+ module subroutine s(x)
+ real :: x
+ end
+ end interface
+end
+submodule(p) p2
+contains
+ module subroutine s(y) ! { dg-error "Mismatch in MODULE PROCEDURE formal argument names" }
+ real :: y
+ end
+end