OSDN Git Service

* timevar.def (TV_WHOPR_WPA_FIXUP): Remove.
[pf3gnuchains/gcc-fork.git] / gcc / attribs.c
index 5ae462e..4d91a0d 100644 (file)
@@ -1,6 +1,7 @@
 /* Functions dealing with attribute handling, used by most front ends.
    Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001,
-   2002, 2003, 2004, 2005, 2007, 2008, 2009 Free Software Foundation, Inc.
+   2002, 2003, 2004, 2005, 2007, 2008, 2009, 2010
+   Free Software Foundation, Inc.
 
 This file is part of GCC.
 
@@ -192,7 +193,7 @@ init_attributes (void)
 /* Insert a single ATTR into the attribute table.  */
 
 void
-register_attribute (const struct attribute_spec *attr) 
+register_attribute (const struct attribute_spec *attr)
 {
   struct substring str;
   void **slot;
@@ -286,6 +287,7 @@ decl_attributes (tree *node, tree attributes, int flags)
       tree *anode = node;
       const struct attribute_spec *spec = lookup_attribute_spec (name);
       bool no_add_attrs = 0;
+      int fn_ptr_quals = 0;
       tree fn_ptr_tmp = NULL_TREE;
 
       if (spec == NULL)
@@ -353,6 +355,7 @@ decl_attributes (tree *node, tree attributes, int flags)
                 This would all be simpler if attributes were part of the
                 declarator, grumble grumble.  */
              fn_ptr_tmp = TREE_TYPE (*anode);
+             fn_ptr_quals = TYPE_QUALS (*anode);
              anode = &fn_ptr_tmp;
              flags &= ~(int) ATTR_FLAG_TYPE_IN_PLACE;
            }
@@ -449,6 +452,8 @@ decl_attributes (tree *node, tree attributes, int flags)
          /* Rebuild the function pointer type and put it in the
             appropriate place.  */
          fn_ptr_tmp = build_pointer_type (fn_ptr_tmp);
+         if (fn_ptr_quals)
+           fn_ptr_tmp = build_qualified_type (fn_ptr_tmp, fn_ptr_quals);
          if (DECL_P (*node))
            TREE_TYPE (*node) = fn_ptr_tmp;
          else