Commit 5818c8e4 by Jason Merrill Committed by Jason Merrill

re PR c++/33620 (internal compiler error: canonical types differ for identical…

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
parent 22a5d013
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
......
......@@ -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))
......
......@@ -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)
......
......@@ -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;
tree *p;
for (t = attributes; t; t = TREE_CHAIN (t))
if (ATTR_IS_DEPENDENT (t))
{
last_dep = t;
attributes = copy_list (attributes);
break;
}
if (DECL_P (*decl_p))
DECL_ATTRIBUTES (*decl_p) = attributes;
p = &DECL_ATTRIBUTES (*decl_p);
else
TYPE_ATTRIBUTES (*decl_p) = attributes;
p = &TYPE_ATTRIBUTES (*decl_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);
if (last_dep)
{
tree late_attrs = NULL_TREE;
tree *q = &late_attrs;
cplus_decl_attributes (decl_p, late_attrs, attr_flags);
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
......
// 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> &) {}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment