summaryrefslogtreecommitdiff
path: root/gcc/attribs.c
diff options
context:
space:
mode:
authormatz <matz@138bc75d-0d04-0410-961f-82ee72b054a4>2010-03-19 16:37:27 +0000
committermatz <matz@138bc75d-0d04-0410-961f-82ee72b054a4>2010-03-19 16:37:27 +0000
commitce6dcb60f82fe72edfd018e6cd89e0cd9dc4aacb (patch)
treea2dcdc35ffed6fba09f04d6569bb5b40c33fbe1e /gcc/attribs.c
parentf2fd38378cdb00ae3c81f5d268e655aebfa35ebb (diff)
downloadgcc-ce6dcb60f82fe72edfd018e6cd89e0cd9dc4aacb.tar.gz
PR c++/43116
* attribs.c (decl_attributes): When rebuilding a function pointer type use the same qualifiers as the original pointer type. testsuite/ * g++.dg/other/pr43116.C: New testcase. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@157578 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/attribs.c')
-rw-r--r--gcc/attribs.c4
1 files changed, 4 insertions, 0 deletions
diff --git a/gcc/attribs.c b/gcc/attribs.c
index 9f2f50bdfd9..9d76a0c30db 100644
--- a/gcc/attribs.c
+++ b/gcc/attribs.c
@@ -286,6 +286,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 +354,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 +451,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