diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index 42c726c48af9..8103821dde15 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -1,3 +1,10 @@
+2007-11-08  Tobias Burnus  <burnus@net-b.de>
+
+	PR fortran/33917
+	* interface.c (check_sym_interfaces): Disallow PROCEDURE-declared
+	procedures for MODULE PROCEDURE.
+	* decl.c (match_procedure_in_interface): Do not mark as procedure.
+
 2007-11-03  Francois-Xavier Coudert  <fxcoudert@gcc.gnu.org>
 
 	PR fortran/33881
diff --git a/gcc/fortran/decl.c b/gcc/fortran/decl.c
index dacfe4a318ab..74c655d07921 100644
--- a/gcc/fortran/decl.c
+++ b/gcc/fortran/decl.c
@@ -4091,8 +4091,6 @@ match_procedure_in_interface (void)
       if (gfc_add_interface (sym) == FAILURE)
 	return MATCH_ERROR;
 
-      sym->attr.procedure = 1;
-
       if (gfc_match_eos () == MATCH_YES)
 	break;
       if (gfc_match_char (',') != MATCH_YES)
diff --git a/gcc/fortran/interface.c b/gcc/fortran/interface.c
index 39f4e9283a2b..7f6406a94e62 100644
--- a/gcc/fortran/interface.c
+++ b/gcc/fortran/interface.c
@@ -1137,7 +1137,9 @@ check_sym_interfaces (gfc_symbol *sym)
 
       for (p = sym->generic; p; p = p->next)
 	{
-	  if (p->sym->attr.mod_proc && p->sym->attr.if_source != IFSRC_DECL)
+	  if (p->sym->attr.mod_proc
+	      && (p->sym->attr.if_source != IFSRC_DECL
+		  || p->sym->attr.procedure))
 	    {
 	      gfc_error ("'%s' at %L is not a module procedure",
 			 p->sym->name, &p->where);
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 676fb88bd7b0..b07ada0da4e1 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,9 @@
+2007-11-08  Tobias Burnus  <burnus@net-b.de>
+
+	PR fortran/33917
+	* gfortran.dg/proc_decl_5.f90: New.
+	* gfortran.dg/proc_decl_6.f90: New.
+
 2007-11-08  Jakub Jelinek  <jakub@redhat.com>
 
 	PR tree-optimization/32575
diff --git a/gcc/testsuite/gfortran.dg/proc_decl_5.f90 b/gcc/testsuite/gfortran.dg/proc_decl_5.f90
new file mode 100644
index 000000000000..b327d5c128ca
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/proc_decl_5.f90
@@ -0,0 +1,28 @@
+! { dg-do run }
+! PR fortran/33945
+!
+! PROCEDURE in the interface was wrongly rejected
+module modproc
+  implicit none
+  interface bar
+    procedure x
+  end interface bar
+  procedure(sub) :: x
+  interface
+    integer function sub()
+    end function sub
+  end interface
+end module modproc
+
+integer function x()
+  implicit none
+  x = -5
+end function x
+
+program test
+  use modproc
+  implicit none
+  if(x() /= -5) call abort()
+end program test
+
+! { dg-final { cleanup-modules "modproc" } }
diff --git a/gcc/testsuite/gfortran.dg/proc_decl_6.f90 b/gcc/testsuite/gfortran.dg/proc_decl_6.f90
new file mode 100644
index 000000000000..d2a6a1de9662
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/proc_decl_6.f90
@@ -0,0 +1,17 @@
+! { dg-do compile }
+! PR fortran/33945
+!
+! MODULE PROCEDURE in the interface was wrongly accepted
+module modproc2
+  implicit none
+  interface
+    subroutine x
+    end subroutine x
+  end interface
+  procedure(x) :: y
+  interface bar
+    module procedure y ! { dg-error "not a module procedure" }
+  end interface bar
+end module modproc2
+
+end