re PR c++/33620 (internal compiler error: canonical types differ for identical types const QList<QStringList> and const QList<QStringList>)

PR c++/33620
        * class.c (finish_struct_bits): Copy TYPE_ATTRIBUTES.
        * pt.c (apply_late_template_attributes): Splice out dependent
        attributes from DECL_ATTRIBUTES.

        * decl.c (cxx_maybe_build_cleanup): Use build_address.

From-SVN: r129553
This commit is contained in:
Jason Merrill 2007-10-22 14:03:10 -04:00 committed by Jason Merrill
parent 22a5d0133d
commit 5818c8e436
5 changed files with 60 additions and 16 deletions

View File

@ -1,3 +1,12 @@
2007-10-22 Jason Merrill <jason@redhat.com>
PR c++/33620
* class.c (finish_struct_bits): Copy TYPE_ATTRIBUTES.
* pt.c (apply_late_template_attributes): Splice out dependent
attributes from DECL_ATTRIBUTES.
* decl.c (cxx_maybe_build_cleanup): Use build_address.
2007-10-17 Manuel Lopez-Ibanez <manu@gcc.gnu.org>
* typeck.c (build_binary_op) : Use appropriate warning option

View File

@ -1452,6 +1452,9 @@ finish_struct_bits (tree t)
TYPE_VFIELD (variants) = TYPE_VFIELD (t);
TYPE_METHODS (variants) = TYPE_METHODS (t);
TYPE_FIELDS (variants) = TYPE_FIELDS (t);
/* All variants of a class have the same attributes. */
TYPE_ATTRIBUTES (variants) = TYPE_ATTRIBUTES (t);
}
if (BINFO_N_BASE_BINFOS (TYPE_BINFO (t)) && TYPE_POLYMORPHIC_P (t))

View File

@ -12134,10 +12134,7 @@ cxx_maybe_build_cleanup (tree decl)
if (TREE_CODE (type) == ARRAY_TYPE)
addr = decl;
else
{
cxx_mark_addressable (decl);
addr = build_unary_op (ADDR_EXPR, decl, 0);
}
addr = build_address (decl);
/* Optimize for space over speed here. */
if (!has_vbases || flag_expensive_optimizations)

View File

@ -6488,23 +6488,47 @@ static void
apply_late_template_attributes (tree *decl_p, tree attributes, int attr_flags,
tree args, tsubst_flags_t complain, tree in_decl)
{
tree late_attrs = NULL_TREE;
tree last_dep = NULL_TREE;
tree t;
if (DECL_P (*decl_p))
DECL_ATTRIBUTES (*decl_p) = attributes;
else
TYPE_ATTRIBUTES (*decl_p) = attributes;
tree *p;
for (t = attributes; t; t = TREE_CHAIN (t))
if (ATTR_IS_DEPENDENT (t))
late_attrs = tree_cons
(TREE_PURPOSE (t),
tsubst_expr (TREE_VALUE (t), args, complain, in_decl,
/*integral_constant_expression_p=*/false),
late_attrs);
{
last_dep = t;
attributes = copy_list (attributes);
break;
}
cplus_decl_attributes (decl_p, late_attrs, attr_flags);
if (DECL_P (*decl_p))
p = &DECL_ATTRIBUTES (*decl_p);
else
p = &TYPE_ATTRIBUTES (*decl_p);
if (last_dep)
{
tree late_attrs = NULL_TREE;
tree *q = &late_attrs;
for (*p = attributes; *p; )
{
t = *p;
if (ATTR_IS_DEPENDENT (t))
{
*p = TREE_CHAIN (t);
TREE_CHAIN (t) = NULL_TREE;
TREE_VALUE (t)
= tsubst_expr (TREE_VALUE (t), args, complain, in_decl,
/*integral_constant_expression_p=*/false);
*q = t;
q = &TREE_CHAIN (t);
}
else
p = &TREE_CHAIN (t);
}
cplus_decl_attributes (decl_p, late_attrs, attr_flags);
}
}
tree

View File

@ -0,0 +1,11 @@
// PR c++/33620
template <typename T>
struct __attribute__((visibility("default"))) List {};
int bar(List<int> args);
bool test(const List<int> &);
int i = bar(List<int>());
bool test(const List<int> &) {}