aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNathan Sidwell <nathan@acm.org>2015-05-23 22:28:54 +0000
committerNathan Sidwell <nathan@gcc.gnu.org>2015-05-23 22:28:54 +0000
commit84a3423b97784ba86bcb37efb39fd528de3671cb (patch)
treeff8367af9f5301322417ebd0e66ee3cc6bfa2287
parent94cbafd1737a6e0a395e5dabca880ba1b0be10d2 (diff)
downloadgcc-84a3423b97784ba86bcb37efb39fd528de3671cb.zip
gcc-84a3423b97784ba86bcb37efb39fd528de3671cb.tar.gz
gcc-84a3423b97784ba86bcb37efb39fd528de3671cb.tar.bz2
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
-rw-r--r--gcc/cp/ChangeLog5
-rw-r--r--gcc/cp/pt.c17
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/template/pr65936.C21
4 files changed, 43 insertions, 5 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 7c9b77e..35d5f34 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -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.
diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c
index 407ef7d..a0c5d7c 100644
--- a/gcc/cp/pt.c
+++ b/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));
}
}
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index fe5d962..e302f01 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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
diff --git a/gcc/testsuite/g++.dg/template/pr65936.C b/gcc/testsuite/g++.dg/template/pr65936.C
new file mode 100644
index 0000000..afa2276
--- /dev/null
+++ b/gcc/testsuite/g++.dg/template/pr65936.C
@@ -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);
+ }
+};