Commit 3aaaa103 by Jason Merrill Committed by Jason Merrill

class.c (mark_type_abi_tags): New.

	* class.c (mark_type_abi_tags): New.
	(check_abi_tags): Use it.

From-SVN: r199629
parent 25c22937
2013-05-31 Jason Merrill <jason@redhat.com>
* class.c (mark_type_abi_tags): New.
(check_abi_tags): Use it.
2013-06-03 Paolo Carlini <paolo.carlini@oracle.com> 2013-06-03 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/57419 PR c++/57419
......
...@@ -1354,11 +1354,11 @@ find_abi_tags_r (tree *tp, int */*walk_subtrees*/, void *data) ...@@ -1354,11 +1354,11 @@ find_abi_tags_r (tree *tp, int */*walk_subtrees*/, void *data)
return NULL_TREE; return NULL_TREE;
} }
/* Check that class T has all the abi tags that subobject SUBOB has, or /* Set IDENTIFIER_MARKED on all the ABI tags on T and its (transitively
warn if not. */ complete) template arguments. */
static void static void
check_abi_tags (tree t, tree subob) mark_type_abi_tags (tree t, bool val)
{ {
tree attributes = lookup_attribute ("abi_tag", TYPE_ATTRIBUTES (t)); tree attributes = lookup_attribute ("abi_tag", TYPE_ATTRIBUTES (t));
if (attributes) if (attributes)
...@@ -1368,25 +1368,41 @@ check_abi_tags (tree t, tree subob) ...@@ -1368,25 +1368,41 @@ check_abi_tags (tree t, tree subob)
{ {
tree tag = TREE_VALUE (list); tree tag = TREE_VALUE (list);
tree id = get_identifier (TREE_STRING_POINTER (tag)); tree id = get_identifier (TREE_STRING_POINTER (tag));
IDENTIFIER_MARKED (id) = true; IDENTIFIER_MARKED (id) = val;
}
}
/* Also mark ABI tags from template arguments. */
if (CLASSTYPE_TEMPLATE_INFO (t))
{
tree args = CLASSTYPE_TI_ARGS (t);
for (int i = 0; i < TMPL_ARGS_DEPTH (args); ++i)
{
tree level = TMPL_ARGS_LEVEL (args, i+1);
for (int j = 0; j < TREE_VEC_LENGTH (level); ++j)
{
tree arg = TREE_VEC_ELT (level, j);
if (CLASS_TYPE_P (arg))
mark_type_abi_tags (arg, val);
}
} }
} }
}
/* Check that class T has all the abi tags that subobject SUBOB has, or
warn if not. */
static void
check_abi_tags (tree t, tree subob)
{
mark_type_abi_tags (t, true);
tree subtype = TYPE_P (subob) ? subob : TREE_TYPE (subob); tree subtype = TYPE_P (subob) ? subob : TREE_TYPE (subob);
struct abi_tag_data data = { t, subob }; struct abi_tag_data data = { t, subob };
cp_walk_tree_without_duplicates (&subtype, find_abi_tags_r, &data); cp_walk_tree_without_duplicates (&subtype, find_abi_tags_r, &data);
if (attributes) mark_type_abi_tags (t, false);
{
for (tree list = TREE_VALUE (attributes); list;
list = TREE_CHAIN (list))
{
tree tag = TREE_VALUE (list);
tree id = get_identifier (TREE_STRING_POINTER (tag));
IDENTIFIER_MARKED (id) = false;
}
}
} }
/* Run through the base classes of T, updating CANT_HAVE_CONST_CTOR_P, /* Run through the base classes of T, updating CANT_HAVE_CONST_CTOR_P,
......
// { dg-options -Wabi-tag }
struct __attribute__ ((abi_tag ("foo"))) A { };
template <class T> struct B: T { };
B<A> b;
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