aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Matz <matz@suse.de>2010-03-19 16:37:27 +0000
committerMichael Matz <matz@gcc.gnu.org>2010-03-19 16:37:27 +0000
commitf9ceed32dc9196ddcd2551526637369910a8407b (patch)
treea2dcdc35ffed6fba09f04d6569bb5b40c33fbe1e
parent3795eae6647e2bcac4b998b194150cafee27906f (diff)
downloadgcc-f9ceed32dc9196ddcd2551526637369910a8407b.zip
gcc-f9ceed32dc9196ddcd2551526637369910a8407b.tar.gz
gcc-f9ceed32dc9196ddcd2551526637369910a8407b.tar.bz2
re PR c++/43116 (ICE when using attributes in a function alias declaration)
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. From-SVN: r157578
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/attribs.c4
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/other/pr43116.C9
4 files changed, 24 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index faed150..c255935 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2010-03-19 Michael Matz <matz@suse.de>
+
+ PR c++/43116
+ * attribs.c (decl_attributes): When rebuilding a function pointer
+ type use the same qualifiers as the original pointer type.
+
2010-03-19 Martin Jambor <mjambor@suse.cz>
* doc/gimple.texi (Logical Operators): Describe is_gimple_ip_invariant
diff --git a/gcc/attribs.c b/gcc/attribs.c
index 9f2f50b..9d76a0c 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
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 3970547..758456e 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,5 +1,10 @@
2010-03-19 Michael Matz <matz@suse.de>
+ PR c++/43116
+ * g++.dg/other/pr43116.C: New testcase.
+
+2010-03-19 Michael Matz <matz@suse.de>
+
PR target/43305
* gcc.dg/pr43305.c: New testcase.
diff --git a/gcc/testsuite/g++.dg/other/pr43116.C b/gcc/testsuite/g++.dg/other/pr43116.C
new file mode 100644
index 0000000..f0d9d01
--- /dev/null
+++ b/gcc/testsuite/g++.dg/other/pr43116.C
@@ -0,0 +1,9 @@
+/* { dg-do compile } */
+extern "C" int rpl_open (const char *filename, int flags, ...) __attribute__
+((__nonnull__ (1)));
+
+namespace gnulib
+{
+ int (*const open) (const char *filename, int flags, ...) __attribute__
+ ((__nonnull__ (1))) = rpl_open;
+}