diff options
-rw-r--r-- | gcc/cp/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/cp/pt.c | 17 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/template/pr65936.C | 21 |
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); + } +}; |