diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 3dbd11b392445db49211d0078d52ec2b30c69be5..6104ecda4f843e3bf449c501434f0a6ae1b5dfde 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+006-08-20  Danny Smith  <dannysmith@users.sourceforge.net>
+
+	PR target/28648 c:
+	* tree.c (handle_dll_attribute): Return early if not a
+   	var or function decl.
+
 2006-08-18  Joseph Myers  <joseph@codesourcery.com>
 
 	PR target/27565
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index ad646c5613cae457a6182c8a2bbf5d5fd839688d..abaa9b7f8569dfdbeb0d8e4cbe8dcd4e4dd7b6be 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2006-08-20  Danny Smith  <dannysmith@users.sourceforge.net>
+
+	PR target/28648 c:
+	* gcc.dg/attr-invalid.c: Add tests for invalid dllimport.
+
 2006-08-20  Paul Thomas  <pault@gcc.gnu.org>
 
 	PR fortran/28630
diff --git a/gcc/testsuite/gcc.dg/attr-invalid.c b/gcc/testsuite/gcc.dg/attr-invalid.c
index c6c437d0bbfa5dc57143d6fbb8902595e1840a69..7d1c151969b443ad8b4e4a0ec0c9deb1e95f29ce 100644
--- a/gcc/testsuite/gcc.dg/attr-invalid.c
+++ b/gcc/testsuite/gcc.dg/attr-invalid.c
@@ -77,3 +77,24 @@ int ATSYM(fn_knrarg) (arg)
 { return 0; }
 
 int ATSYM(fn_isoarg) (int arg ATTR) { return 0; } /* { dg-warning "attribute ignored" "" } */
+
+
+/* PR target/28648  */
+/* These are invalid on all targets.  Applying to PARM_ or FIELD_DECL
+   also caused a tree checking ice on targets that support dllimport.  */
+#undef AT
+#define AT dllimport
+
+typedef int ATSYM(type) ATTR; /* { dg-warning "attribute ignored" "" } */
+
+typedef int (*ATSYM(fntype))(void) ATTR; /* { dg-warning "attribute ignored" "" } */
+
+struct ATSYM(struct) {
+  char dummy ATTR; /* { dg-warning "attribute ignored" "" } */
+};
+
+int ATSYM(fn_knrarg) (arg)
+  int arg ATTR; /* { dg-warning "attribute ignored" "" } */
+{ return 0; }
+
+int ATSYM(fn_isoarg) (int arg ATTR) { return 0; } /* { dg-warning "attribute ignored" "" } */
diff --git a/gcc/tree.c b/gcc/tree.c
index 2c95a266416f59fdf6c53a2df283a9ad73aea6b0..a58c3274c4bf0db876d3feadd315ea282c62f975 100644
--- a/gcc/tree.c
+++ b/gcc/tree.c
@@ -3706,9 +3706,18 @@ handle_dll_attribute (tree * pnode, tree name, tree args, int flags,
       return NULL_TREE;
     }
 
+  if (TREE_CODE (node) != FUNCTION_DECL
+      && TREE_CODE (node) != VAR_DECL)
+    {
+      *no_add_attrs = true;
+      warning (OPT_Wattributes, "%qs attribute ignored",
+	       IDENTIFIER_POINTER (name));
+      return NULL_TREE;
+    }
+
   /* Report error on dllimport ambiguities seen now before they cause
      any damage.  */
-  if (is_attribute_p ("dllimport", name))
+  else if (is_attribute_p ("dllimport", name))
     {
       /* Honor any target-specific overrides. */ 
       if (!targetm.valid_dllimport_attribute_p (node))