re PR c++/65936 (ICE: canonical types differ for identical types)

cp/
	PR c++/65936
	* pt.c (lookup_template_class_1): Copy may_alias attribute too.

	testsuite/
	PR c++/65936
	* g++.dg/template/pr65936.C: New.

From-SVN: r223613
This commit is contained in:
Nathan Sidwell 2015-05-23 22:28:54 +00:00 committed by Nathan Sidwell
parent 94cbafd173
commit 84a3423b97
4 changed files with 43 additions and 5 deletions

View File

@ -1,3 +1,8 @@
2015-05-23 Nathan Sidwell <nathan@acm.org>
PR c++/65936
* pt.c (lookup_template_class_1): Copy may_alias attribute too.
2015-05-22 Jim Wilson <jim.wilson@linaro.org>
* Make-lang.in (check_g++_parallelize): Update comment.

View File

@ -7905,15 +7905,22 @@ lookup_template_class_1 (tree d1, tree arglist, tree in_decl, tree context,
if (OVERLOAD_TYPE_P (t)
&& !DECL_ALIAS_TEMPLATE_P (gen_tmpl))
{
if (tree attributes
= lookup_attribute ("abi_tag", TYPE_ATTRIBUTES (template_type)))
static const char *tags[] = {"abi_tag", "may_alias"};
for (unsigned ix = 0; ix != 2; ix++)
{
if (!TREE_CHAIN (attributes))
tree attributes
= lookup_attribute (tags[ix], TYPE_ATTRIBUTES (template_type));
if (!attributes)
;
else if (!TREE_CHAIN (attributes) && !TYPE_ATTRIBUTES (t))
TYPE_ATTRIBUTES (t) = attributes;
else
TYPE_ATTRIBUTES (t)
= build_tree_list (TREE_PURPOSE (attributes),
TREE_VALUE (attributes));
= tree_cons (TREE_PURPOSE (attributes),
TREE_VALUE (attributes),
TYPE_ATTRIBUTES (t));
}
}

View File

@ -1,3 +1,8 @@
2015-05-23 Nathan Sidwell <nathan@acm.org>
PR c++/65936
* g++.dg/template/pr65936.C: New.
2015-05-22 Marc Glisse <marc.glisse@inria.fr>
PR tree-optimization/63387

View File

@ -0,0 +1,21 @@
// checking ICE in canonical typing
class A;
template <typename> struct B
{
typedef A type;
};
template <class T> class C
: public B<T>::type
{
} __attribute__ ((__may_alias__));
class A
{
operator const C<int> &()
{
return *static_cast<const C<int> *> (this);
}
};