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
This commit is contained in:
Michael Matz 2010-03-19 16:37:27 +00:00 committed by Michael Matz
parent 3795eae664
commit f9ceed32dc
4 changed files with 24 additions and 0 deletions

View File

@ -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

View File

@ -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

View File

@ -1,3 +1,8 @@
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

View File

@ -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;
}