mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-03-21 02:50:27 +08:00
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:
parent
22a5d0133d
commit
5818c8e436
@ -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
|
||||
|
@ -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)
|
||||
|
48
gcc/cp/pt.c
48
gcc/cp/pt.c
@ -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
|
||||
|
11
gcc/testsuite/g++.dg/ext/tmplattr7.C
Normal file
11
gcc/testsuite/g++.dg/ext/tmplattr7.C
Normal 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> &) {}
|
Loading…
x
Reference in New Issue
Block a user