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:
parent
94cbafd173
commit
84a3423b97
@ -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.
|
||||
|
17
gcc/cp/pt.c
17
gcc/cp/pt.c
@ -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));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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
|
||||
|
21
gcc/testsuite/g++.dg/template/pr65936.C
Normal file
21
gcc/testsuite/g++.dg/template/pr65936.C
Normal 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);
|
||||
}
|
||||
};
|
Loading…
Reference in New Issue
Block a user