From 27e0de6717dd3012c9a4cc0e424b99486745e78f Mon Sep 17 00:00:00 2001
From: dannysmith <dannysmith@138bc75d-0d04-0410-961f-82ee72b054a4>
Date: Sun, 20 Aug 2006 08:46:13 +0000
Subject: [PATCH] 	PR target/28648 c: 	* tree.c
 (handle_dll_attribute): Return early if not a    	var or function decl.

testsuite
	* gcc.dg/attr-invalid.c: Add tests for invalid dllimport.



git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@116270 138bc75d-0d04-0410-961f-82ee72b054a4
---
 gcc/ChangeLog                       |  6 ++++++
 gcc/testsuite/ChangeLog             |  5 +++++
 gcc/testsuite/gcc.dg/attr-invalid.c | 21 +++++++++++++++++++++
 gcc/tree.c                          | 11 ++++++++++-
 4 files changed, 42 insertions(+), 1 deletion(-)

diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 3dbd11b39244..6104ecda4f84 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 ad646c5613ca..abaa9b7f8569 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 c6c437d0bbfa..7d1c151969b4 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 2c95a266416f..a58c3274c4bf 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))
-- 
GitLab