+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
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))
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)
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