Commit 3acef2ae by Jason Merrill Committed by Jason Merrill

stor-layout.c (do_type_align): Only copy DECL_USER_ALIGN from TYPE_USER_ALIGN for FIELD_DECLs.

        * stor-layout.c (do_type_align): Only copy DECL_USER_ALIGN from
        TYPE_USER_ALIGN for FIELD_DECLs.

        * attribs.c (decl_attributes): Rebuild the function pointer type after
        changing the target type.
        * tree.c (get_qualified_type): Also check that the attributes match.

From-SVN: r70597
parent 8f7d850c
2003-08-20 Jason Merrill <jason@redhat.com>
* stor-layout.c (do_type_align): Only copy DECL_USER_ALIGN from
TYPE_USER_ALIGN for FIELD_DECLs.
* attribs.c (decl_attributes): Rebuild the function pointer type after
changing the target type.
* tree.c (get_qualified_type): Also check that the attributes match.
2003-08-19 Matt Kraai <kraai@alumni.cmu.edu> 2003-08-19 Matt Kraai <kraai@alumni.cmu.edu>
* Makefile.in (STAGESTUFF): Move cc1obj$(exeext) from here ... * Makefile.in (STAGESTUFF): Move cc1obj$(exeext) from here ...
......
...@@ -154,6 +154,7 @@ decl_attributes (tree *node, tree attributes, int flags) ...@@ -154,6 +154,7 @@ decl_attributes (tree *node, tree attributes, int flags)
tree *anode = node; tree *anode = node;
const struct attribute_spec *spec = NULL; const struct attribute_spec *spec = NULL;
bool no_add_attrs = 0; bool no_add_attrs = 0;
tree fn_ptr_tmp = NULL_TREE;
size_t i; size_t i;
for (i = 0; i < ARRAY_SIZE (attribute_tables); i++) for (i = 0; i < ARRAY_SIZE (attribute_tables); i++)
...@@ -222,9 +223,18 @@ decl_attributes (tree *node, tree attributes, int flags) ...@@ -222,9 +223,18 @@ decl_attributes (tree *node, tree attributes, int flags)
&& (TREE_CODE (TREE_TYPE (*anode)) == FUNCTION_TYPE && (TREE_CODE (TREE_TYPE (*anode)) == FUNCTION_TYPE
|| TREE_CODE (TREE_TYPE (*anode)) == METHOD_TYPE)) || TREE_CODE (TREE_TYPE (*anode)) == METHOD_TYPE))
{ {
if (!(flags & (int) ATTR_FLAG_TYPE_IN_PLACE)) /* OK, this is a bit convoluted. We can't just make a copy
*anode = build_type_copy (*anode); of the pointer type and modify its TREE_TYPE, because if
anode = &TREE_TYPE (*anode); we change the attributes of the target type the pointer
type needs to have a different TYPE_MAIN_VARIANT. So we
pull out the target type now, frob it as appropriate, and
rebuild the pointer type later.
This would all be simpler if attributes were part of the
declarator, grumble grumble. */
fn_ptr_tmp = TREE_TYPE (*anode);
anode = &fn_ptr_tmp;
flags &= ~(int) ATTR_FLAG_TYPE_IN_PLACE;
} }
else if (flags & (int) ATTR_FLAG_FUNCTION_NEXT) else if (flags & (int) ATTR_FLAG_FUNCTION_NEXT)
{ {
...@@ -291,6 +301,19 @@ decl_attributes (tree *node, tree attributes, int flags) ...@@ -291,6 +301,19 @@ decl_attributes (tree *node, tree attributes, int flags)
old_attrs)); old_attrs));
} }
} }
if (fn_ptr_tmp)
{
/* Rebuild the function pointer type and put it in the
appropriate place. */
fn_ptr_tmp = build_pointer_type (fn_ptr_tmp);
if (DECL_P (*node))
TREE_TYPE (*node) = fn_ptr_tmp;
else if (TREE_CODE (*node) == POINTER_TYPE)
*node = fn_ptr_tmp;
else
abort ();
}
} }
return returned_attrs; return returned_attrs;
......
...@@ -344,7 +344,8 @@ do_type_align (tree type, tree decl) ...@@ -344,7 +344,8 @@ do_type_align (tree type, tree decl)
if (TYPE_ALIGN (type) > DECL_ALIGN (decl)) if (TYPE_ALIGN (type) > DECL_ALIGN (decl))
{ {
DECL_ALIGN (decl) = TYPE_ALIGN (type); DECL_ALIGN (decl) = TYPE_ALIGN (type);
DECL_USER_ALIGN (decl) = TYPE_USER_ALIGN (type); if (TREE_CODE (decl) == FIELD_DECL)
DECL_USER_ALIGN (decl) = TYPE_USER_ALIGN (type);
} }
} }
......
...@@ -2849,7 +2849,8 @@ get_qualified_type (tree type, int type_quals) ...@@ -2849,7 +2849,8 @@ get_qualified_type (tree type, int type_quals)
preserve the TYPE_NAME, since there is code that depends on this. */ preserve the TYPE_NAME, since there is code that depends on this. */
for (t = TYPE_MAIN_VARIANT (type); t; t = TYPE_NEXT_VARIANT (t)) for (t = TYPE_MAIN_VARIANT (type); t; t = TYPE_NEXT_VARIANT (t))
if (TYPE_QUALS (t) == type_quals && TYPE_NAME (t) == TYPE_NAME (type) if (TYPE_QUALS (t) == type_quals && TYPE_NAME (t) == TYPE_NAME (type)
&& TYPE_CONTEXT (t) == TYPE_CONTEXT (type)) && TYPE_CONTEXT (t) == TYPE_CONTEXT (type)
&& attribute_list_equal (TYPE_ATTRIBUTES (t), TYPE_ATTRIBUTES (type)))
return t; return t;
return NULL_TREE; return NULL_TREE;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment