diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index 0b1eca4e5829a185629dd132b4ab422c22f888a8..73dcbf87d8e94c2a058ec12e256b9ec5b782b25a 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -1,3 +1,8 @@
+2007-09-13  Tobias Burnus  <burnus@net-b.de>
+
+	* symbol.c (gfc_add_elemental,gfc_add_pure,gfc_add_recursive):
+	Allow prefixes only to be specified once.
+
 2007-09-13  Tobias Burnus  <burnus@net-b.de>
 
 	PR fortran/33412
diff --git a/gcc/fortran/symbol.c b/gcc/fortran/symbol.c
index 01f64e277ed5ad461f2586316520381dd92707de..6ed366f607f632d9da6078a6338a4e2d5fa8ad23 100644
--- a/gcc/fortran/symbol.c
+++ b/gcc/fortran/symbol.c
@@ -1144,6 +1144,12 @@ gfc_add_elemental (symbol_attribute *attr, locus *where)
   if (check_used (attr, NULL, where))
     return FAILURE;
 
+  if (attr->elemental)
+    {
+      duplicate_attr ("ELEMENTAL", where);
+      return FAILURE;
+    }
+
   attr->elemental = 1;
   return check_conflict (attr, NULL, where);
 }
@@ -1156,6 +1162,12 @@ gfc_add_pure (symbol_attribute *attr, locus *where)
   if (check_used (attr, NULL, where))
     return FAILURE;
 
+  if (attr->pure)
+    {
+      duplicate_attr ("PURE", where);
+      return FAILURE;
+    }
+
   attr->pure = 1;
   return check_conflict (attr, NULL, where);
 }
@@ -1168,6 +1180,12 @@ gfc_add_recursive (symbol_attribute *attr, locus *where)
   if (check_used (attr, NULL, where))
     return FAILURE;
 
+  if (attr->recursive)
+    {
+      duplicate_attr ("RECURSIVE", where);
+      return FAILURE;
+    }
+
   attr->recursive = 1;
   return check_conflict (attr, NULL, where);
 }
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index fd4a00cb299e3515fe6d2d1959eefae87ecdfcba..9df45f8f49da86faa0c61185adabdb0bee6edbc2 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,7 @@
+2007-09-13  Tobias Burnus  <burnus@net-b.de>
+
+	* gfortran.dg/recursive_check_3.f90: New.
+
 2007-09-13  Tobias Burnus  <burnus@net-b.de>
 
 	PR fortran/33412
diff --git a/gcc/testsuite/gfortran.dg/recursive_check_3.f90 b/gcc/testsuite/gfortran.dg/recursive_check_3.f90
new file mode 100644
index 0000000000000000000000000000000000000000..23904a8b9915c3389fd5a6d064fa358d37fed854
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/recursive_check_3.f90
@@ -0,0 +1,22 @@
+! { dg-do compile }
+!
+module m1
+contains
+pure pure subroutine a1(b) ! { dg-error "Duplicate PURE attribute specified" }
+  real, intent(in) :: b    ! { dg-error "Unexpected data declaration statement" }
+end subroutine a1          ! { dg-error "Expecting END MODULE" }
+end module m1 ! { dg-warning "CONTAINS statement without FUNCTION" }
+
+module m2
+contains
+elemental elemental subroutine a2(b) ! { dg-error "Duplicate ELEMENTAL attribute" }
+  real, intent(in) :: b    ! { dg-error "Unexpected data declaration statement" }
+end subroutine a2          ! { dg-error "Expecting END MODULE" }
+end module m2 ! { dg-warning "CONTAINS statement without FUNCTION" }
+
+module m3
+contains
+recursive recursive subroutine a3(b) ! { dg-error "Duplicate RECURSIVE attribute" }
+  real, intent(in) :: b    ! { dg-error "Unexpected data declaration statement" }
+end subroutine a3          ! { dg-error "Expecting END MODULE" }
+end module m3 ! { dg-warning "CONTAINS statement without FUNCTION" }