aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorHarald Anlauf <anlauf@gmx.de>2023-03-21 19:58:31 +0100
committerHarald Anlauf <anlauf@gmx.de>2023-03-21 20:00:32 +0100
commitdd282b16bfd3c6e218dffb7798a375365b10ae22 (patch)
tree43ec04d8b8edea6267da9d2456abc53cd85fd27b /gcc
parent8ff3ca2d94721fab78f167d435d4ea4fa4fdca6a (diff)
downloadgcc-dd282b16bfd3c6e218dffb7798a375365b10ae22.zip
gcc-dd282b16bfd3c6e218dffb7798a375365b10ae22.tar.gz
gcc-dd282b16bfd3c6e218dffb7798a375365b10ae22.tar.bz2
Fortran: reject MODULE PROCEDURE outside generic module interface [PR99036]
gcc/fortran/ChangeLog: PR fortran/99036 * decl.cc (gfc_match_modproc): Reject MODULE PROCEDURE if not in a generic module interface. gcc/testsuite/ChangeLog: PR fortran/99036 * gfortran.dg/pr99036.f90: New test.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/fortran/decl.cc7
-rw-r--r--gcc/testsuite/gfortran.dg/pr99036.f909
2 files changed, 13 insertions, 3 deletions
diff --git a/gcc/fortran/decl.cc b/gcc/fortran/decl.cc
index c8f0bb8..233bf24 100644
--- a/gcc/fortran/decl.cc
+++ b/gcc/fortran/decl.cc
@@ -9995,9 +9995,10 @@ gfc_match_modproc (void)
gfc_namespace *module_ns;
gfc_interface *old_interface_head, *interface;
- if ((gfc_state_stack->state != COMP_INTERFACE
- && gfc_state_stack->state != COMP_CONTAINS)
- || gfc_state_stack->previous == NULL
+ if (gfc_state_stack->previous == NULL
+ || (gfc_state_stack->state != COMP_INTERFACE
+ && (gfc_state_stack->state != COMP_CONTAINS
+ || gfc_state_stack->previous->state != COMP_INTERFACE))
|| current_interface.type == INTERFACE_NAMELESS
|| current_interface.type == INTERFACE_ABSTRACT)
{
diff --git a/gcc/testsuite/gfortran.dg/pr99036.f90 b/gcc/testsuite/gfortran.dg/pr99036.f90
new file mode 100644
index 0000000..a6e396f
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/pr99036.f90
@@ -0,0 +1,9 @@
+! { dg-do compile }
+! PR fortran/99036 - ICE in gfc_current_interface_head
+! Contributed by G. Steinmetz
+
+module m
+contains
+ module procedure s ! { dg-error "must be in a generic module interface" }
+ end
+end