diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index d8b8652f913a544c67fae9a43f071d7117089957..4b35a3d37d4655a35794f59bbb4e3f9cda8f1e78 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,8 @@
+2006-07-15  Volker Reichelt  <reichelt@igpm.rwth-aachen.de>
+
+	PR c++/28387
+	* decl2.c (cplus_decl_attributes): Check for invalid decls.
+
 2006-07-14  Volker Reichelt  <reichelt@igpm.rwth-aachen.de>
 
 	PR c++/28343
diff --git a/gcc/cp/decl2.c b/gcc/cp/decl2.c
index 11c4901cb3ad6fce6221fdcc4245756498fc43de..3b4e7ce02fbd35dd80a14024a795250de4a8dcd8 100644
--- a/gcc/cp/decl2.c
+++ b/gcc/cp/decl2.c
@@ -997,7 +997,8 @@ grokbitfield (const cp_declarator *declarator,
 void
 cplus_decl_attributes (tree *decl, tree attributes, int flags)
 {
-  if (*decl == NULL_TREE || *decl == void_type_node)
+  if (*decl == NULL_TREE || *decl == void_type_node
+      || *decl == error_mark_node)
     return;
 
   if (TREE_CODE (*decl) == TEMPLATE_DECL)
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index fa86c8121cace8859f28268a26f9fe65a5168b7e..d9edf48b3be203c4c5b5cea4ee79e652995dbd97 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2006-07-15  Volker Reichelt  <reichelt@igpm.rwth-aachen.de>
+
+	PR c++/28387
+	* g++.dg/ext/attrib24.C: New test.
+
 2006-07-14  Volker Reichelt  <reichelt@igpm.rwth-aachen.de>
 
 	PR c++/28343
diff --git a/gcc/testsuite/g++.dg/ext/attrib24.C b/gcc/testsuite/g++.dg/ext/attrib24.C
new file mode 100644
index 0000000000000000000000000000000000000000..208809a3f3e0b742b90673a301f6a7a58640d94f
--- /dev/null
+++ b/gcc/testsuite/g++.dg/ext/attrib24.C
@@ -0,0 +1,4 @@
+// PR c++/28387
+// { dg-do compile }
+
+enum __attribute__((unused)) E;  // { dg-error "without previous declaration" }