* cp-tree.h (xref_tag): Change prototype.
(handle_class_head): Likewise.
(build_x_component_ref): Likewise.
* decl.c (cxx_init_decl_processing): Adjust call to xref_tag.
(xref_tag): Take attributes as a separate parameter.
(xref_tag_from_type): Adjust call to xref_tag.
* decl2.c (build_expr_from_tree): Adjust call to
build_x_component_ref.
(handle_class_head): Take attributes as a separate parameter.
* parse.y (parse_xref_tag): New function.
(parse_handle_class_head): Likewise.
(primary): Use parse_xref_tag.
(class_head_decl): Use parse_handle_class_head.
(class_head_defn): Likewise.
* rtti.c (init_rtti_processing): Adjust call to xref_tag.
(build_dynamic_cast_1): Likewise.
(create_pseudo_type_info): Likewise.
(emit_support_tinfos): Likewise.
* typeck.c (build_object_ref): Adjust call to
build_x_component_ref.
(build_x_component_ref): Remove protect parameter.
From-SVN: r55013
+2002-06-26 Mark Mitchell <mark@codesourcery.com>
+
+ * cp-tree.h (xref_tag): Change prototype.
+ (handle_class_head): Likewise.
+ (build_x_component_ref): Likewise.
+ * decl.c (cxx_init_decl_processing): Adjust call to xref_tag.
+ (xref_tag): Take attributes as a separate parameter.
+ (xref_tag_from_type): Adjust call to xref_tag.
+ * decl2.c (build_expr_from_tree): Adjust call to
+ build_x_component_ref.
+ (handle_class_head): Take attributes as a separate parameter.
+ * parse.y (parse_xref_tag): New function.
+ (parse_handle_class_head): Likewise.
+ (primary): Use parse_xref_tag.
+ (class_head_decl): Use parse_handle_class_head.
+ (class_head_defn): Likewise.
+ * rtti.c (init_rtti_processing): Adjust call to xref_tag.
+ (build_dynamic_cast_1): Likewise.
+ (create_pseudo_type_info): Likewise.
+ (emit_support_tinfos): Likewise.
+ * typeck.c (build_object_ref): Adjust call to
+ build_x_component_ref.
+ (build_x_component_ref): Remove protect parameter.
+
2002-06-25 Mark Mitchell <mark@codesourcery.com>
* call.c (build_op_delete_call): Use BASELINK_FUNCTIONS.
extern void grok_special_member_properties PARAMS ((tree));
extern int grok_ctor_properties PARAMS ((tree, tree));
extern void grok_op_properties PARAMS ((tree, int));
-extern tree xref_tag PARAMS ((tree, tree, int));
+extern tree xref_tag (enum tag_types, tree, tree, bool);
extern tree xref_tag_from_type PARAMS ((tree, tree, int));
extern void xref_basetypes PARAMS ((tree, tree));
extern tree start_enum PARAMS ((tree));
extern void do_using_directive PARAMS ((tree));
extern void check_default_args PARAMS ((tree));
extern void mark_used PARAMS ((tree));
-extern tree handle_class_head PARAMS ((tree, tree, tree, int, int *));
+extern tree handle_class_head (enum tag_types, tree, tree, tree, int, int *);
extern tree lookup_arg_dependent PARAMS ((tree, tree, tree));
extern void finish_static_data_member_decl PARAMS ((tree, tree, tree, int));
extern tree build_artificial_parm PARAMS ((tree, tree));
extern tree build_object_ref PARAMS ((tree, tree, tree));
extern tree build_component_ref_1 PARAMS ((tree, tree, int));
extern tree build_component_ref PARAMS ((tree, tree, tree, int));
-extern tree build_x_component_ref PARAMS ((tree, tree, tree, int));
+extern tree build_x_component_ref PARAMS ((tree, tree, tree));
extern tree build_x_indirect_ref PARAMS ((tree, const char *));
extern tree build_indirect_ref PARAMS ((tree, const char *));
extern tree build_array_ref PARAMS ((tree, tree));
tree ptr_ftype_sizetype;
push_namespace (std_identifier);
- bad_alloc_type_node = xref_tag
- (class_type_node, get_identifier ("bad_alloc"), 1);
+ bad_alloc_type_node
+ = xref_tag (class_type, get_identifier ("bad_alloc"),
+ /*attributes=*/NULL_TREE, 1);
pop_namespace ();
ptr_ftype_sizetype
= build_function_type (ptr_type_node,
scope.) */
tree
-xref_tag (code_type_node, name, globalize)
- tree code_type_node;
- tree name;
- int globalize;
+xref_tag (enum tag_types tag_code, tree name, tree attributes,
+ bool globalize)
{
- enum tag_types tag_code;
enum tree_code code;
register tree ref, t;
struct cp_binding_level *b = current_binding_level;
- tree attributes = NULL_TREE;
tree context = NULL_TREE;
- /* If we are called from the parser, code_type_node will sometimes be a
- TREE_LIST. This indicates that the user wrote
- "class __attribute__ ((foo)) bar". Extract the attributes so we can
- use them later. */
- if (TREE_CODE (code_type_node) == TREE_LIST)
- {
- attributes = TREE_PURPOSE (code_type_node);
- code_type_node = TREE_VALUE (code_type_node);
- }
-
- tag_code = (enum tag_types) tree_low_cst (code_type_node, 1);
switch (tag_code)
{
case record_type:
tree old, id;
int globalize;
{
- tree code_type_node;
+ enum tag_types tag_kind;
if (TREE_CODE (old) == RECORD_TYPE)
- code_type_node = (CLASSTYPE_DECLARED_CLASS (old)
- ? class_type_node : record_type_node);
+ tag_kind = (CLASSTYPE_DECLARED_CLASS (old) ? class_type : record_type);
else
- code_type_node = union_type_node;
+ tag_kind = union_type;
if (id == NULL_TREE)
id = TYPE_IDENTIFIER (old);
- return xref_tag (code_type_node, id, globalize);
+ return xref_tag (tag_kind, id, /*attributes=*/NULL_TREE, globalize);
}
/* REF is a type (named NAME), for which we have just seen some
TREE_OPERAND (field, 0),
TREE_OPERAND (field, 1));
else
- return build_x_component_ref (object, field,
- NULL_TREE, 1);
+ return build_x_component_ref (object, field, NULL_TREE);
}
case THROW_EXPR:
Return a TYPE_DECL for the type declared by ID in SCOPE. */
tree
-handle_class_head (aggr, scope, id, defn_p, new_type_p)
- tree aggr, scope, id;
+handle_class_head (tag_kind, scope, id, attributes, defn_p, new_type_p)
+ enum tag_types tag_kind;
+ tree scope, id, attributes;
int defn_p;
int *new_type_p;
{
if (!decl)
{
- decl = TYPE_MAIN_DECL (xref_tag (aggr, id, !defn_p));
+ decl = TYPE_MAIN_DECL (xref_tag (tag_kind, id, attributes, !defn_p));
xrefd_p = true;
}
/* It is legal to define a class with a different class key,
and this changes the default member access. */
CLASSTYPE_DECLARED_CLASS (TREE_TYPE (decl))
- = aggr == class_type_node;
+ = (tag_kind == class_type);
if (!xrefd_p && PROCESSING_REAL_TEMPLATE_DECL_P ())
decl = push_template_decl (decl);
malloced_yyss = newss; \
malloced_yyvs = (void *) newvs; \
} while (0)
-
#define OP0(NODE) (TREE_OPERAND (NODE, 0))
#define OP1(NODE) (TREE_OPERAND (NODE, 1))
static void frob_specs PARAMS ((tree, tree));
static void check_class_key PARAMS ((tree, tree));
static tree parse_scoped_id PARAMS ((tree));
+static tree parse_xref_tag (tree, tree, int);
+static tree parse_handle_class_head (tree, tree, tree, int, int *);
/* Cons up an empty parameter list. */
static inline tree
{ $$ = finish_qualified_call_expr ($1, NULL_TREE); }
| object object_template_id %prec UNARY
{
- $$ = build_x_component_ref ($$, $2, NULL_TREE, 1);
+ $$ = build_x_component_ref ($$, $2, NULL_TREE);
}
| object object_template_id '(' nonnull_exprlist ')'
{ $$ = finish_object_call_expr ($2, $1, $4); }
| object object_template_id LEFT_RIGHT
{ $$ = finish_object_call_expr ($2, $1, NULL_TREE); }
| object unqualified_id %prec UNARY
- { $$ = build_x_component_ref ($$, $2, NULL_TREE, 1); }
+ { $$ = build_x_component_ref ($$, $2, NULL_TREE); }
| object overqualified_id %prec UNARY
{ if (processing_template_decl)
$$ = build_min_nt (COMPONENT_REF, $1, $2);
current_enum_type = $<ttype>3;
check_for_missing_semicolon ($$.t); }
| ENUM identifier
- { $$.t = xref_tag (enum_type_node, $2, 1);
+ { $$.t = parse_xref_tag (enum_type_node, $2, 1);
$$.new_type_flag = 0; }
| ENUM complex_type_name
- { $$.t = xref_tag (enum_type_node, $2, 1);
+ { $$.t = parse_xref_tag (enum_type_node, $2, 1);
$$.new_type_flag = 0; }
| TYPENAME_KEYWORD typename_sub
{ $$.t = $2;
class_head_decl:
class_head %prec EMPTY
{
- $$.t = handle_class_head (current_aggr,
- TREE_PURPOSE ($1), TREE_VALUE ($1),
- 0, &$$.new_type_flag);
+ $$.t = parse_handle_class_head (current_aggr,
+ TREE_PURPOSE ($1),
+ TREE_VALUE ($1),
+ 0, &$$.new_type_flag);
}
| aggr identifier_defn %prec EMPTY
{
current_aggr = $1;
- $$.t = TYPE_MAIN_DECL (xref_tag (current_aggr, $2, 0));
+ $$.t = TYPE_MAIN_DECL (parse_xref_tag (current_aggr, $2, 0));
$$.new_type_flag = 1;
}
| class_head_apparent_template %prec EMPTY
class_head '{'
{
yyungetc ('{', 1);
- $$.t = handle_class_head (current_aggr,
- TREE_PURPOSE ($1), TREE_VALUE ($1),
- 1, &$$.new_type_flag);
+ $$.t = parse_handle_class_head (current_aggr,
+ TREE_PURPOSE ($1),
+ TREE_VALUE ($1),
+ 1,
+ &$$.new_type_flag);
}
| class_head ':'
{
yyungetc (':', 1);
- $$.t = handle_class_head (current_aggr,
- TREE_PURPOSE ($1), TREE_VALUE ($1),
- 1, &$$.new_type_flag);
+ $$.t = parse_handle_class_head (current_aggr,
+ TREE_PURPOSE ($1),
+ TREE_VALUE ($1),
+ 1, &$$.new_type_flag);
}
| class_head_apparent_template '{'
{
{
yyungetc ('{', 1);
current_aggr = $1;
- $$.t = handle_class_head (current_aggr,
- NULL_TREE, $2,
- 1, &$$.new_type_flag);
+ $$.t = parse_handle_class_head (current_aggr,
+ NULL_TREE, $2,
+ 1, &$$.new_type_flag);
}
| aggr identifier_defn ':'
{
yyungetc (':', 1);
current_aggr = $1;
- $$.t = handle_class_head (current_aggr,
- NULL_TREE, $2,
- 1, &$$.new_type_flag);
+ $$.t = parse_handle_class_head (current_aggr,
+ NULL_TREE, $2,
+ 1, &$$.new_type_flag);
}
| aggr '{'
{
current_aggr = $1;
- $$.t = TYPE_MAIN_DECL (xref_tag ($1, make_anon_name (), 0));
+ $$.t = TYPE_MAIN_DECL (parse_xref_tag ($1,
+ make_anon_name (),
+ 0));
$$.new_type_flag = 0;
yyungetc ('{', 1);
}
return do_scoped_id (token, id);
}
+/* AGGR may be either a type node (like class_type_node) or a
+ TREE_LIST whose TREE_PURPOSE is a list of attributes and whose
+ TREE_VALUE is a type node. Set *TAG_KIND and *ATTRIBUTES to
+ represent the information encoded. */
+
+static void
+parse_split_aggr (tree aggr, enum tag_types *tag_kind, tree *attributes)
+{
+ if (TREE_CODE (aggr) == TREE_LIST)
+ {
+ *attributes = TREE_PURPOSE (aggr);
+ aggr = TREE_VALUE (aggr);
+ }
+ else
+ *attributes = NULL_TREE;
+ *tag_kind = (enum tag_types) tree_low_cst (aggr, 1);
+}
+
+/* Like xref_tag, except that the AGGR may be either a type node (like
+ class_type_node) or a TREE_LIST whose TREE_PURPOSE is a list of
+ attributes and whose TREE_VALUE is a type node. */
+
+static tree
+parse_xref_tag (tree aggr, tree name, int globalize)
+{
+ tree attributes;
+ enum tag_types tag_kind;
+ parse_split_aggr (aggr, &tag_kind, &attributes);
+ return xref_tag (tag_kind, name, attributes, globalize);
+}
+
+/* Like handle_class_head, but AGGR may be as for parse_xref_tag. */
+
+static tree
+parse_handle_class_head (tree aggr, tree scope, tree id,
+ int defn_p, int *new_type_p)
+{
+ tree attributes;
+ enum tag_types tag_kind;
+ parse_split_aggr (aggr, &tag_kind, &attributes);
+ return handle_class_head (tag_kind, scope, id, attributes,
+ defn_p, new_type_p);
+}
+
#include "gt-cp-parse.h"
init_rtti_processing ()
{
push_namespace (std_identifier);
- type_info_type_node = xref_tag
- (class_type_node, get_identifier ("type_info"), 1);
+ type_info_type_node
+ = xref_tag (class_type, get_identifier ("type_info"),
+ /*attributes=*/NULL_TREE, 1);
pop_namespace ();
tinfo_decl_type =
build_qualified_type (type_info_type_node, TYPE_QUAL_CONST);
const char *name;
push_nested_namespace (ns);
- tinfo_ptr = xref_tag (class_type_node,
+ tinfo_ptr = xref_tag (class_type,
get_identifier ("__class_type_info"),
+ /*attributes=*/NULL_TREE,
1);
tinfo_ptr = build_pointer_type
sprintf (pseudo_name + strlen (pseudo_name), "%d", ident);
/* Get the vtable decl. */
- real_type = xref_tag (class_type_node, get_identifier (real_name), 1);
+ real_type = xref_tag (class_type, get_identifier (real_name),
+ /*attributes=*/NULL_TREE, 1);
if (! TYPE_SIZE (real_type))
{
/* We never saw a definition of this type, so we need to tell the
tree bltn_type, dtor;
push_nested_namespace (abi_node);
- bltn_type = xref_tag (class_type_node,
- get_identifier ("__fundamental_type_info"), 1);
+ bltn_type = xref_tag (class_type,
+ get_identifier ("__fundamental_type_info"),
+ /*attributes=*/NULL_TREE,
+ 1);
pop_nested_namespace (abi_node);
if (!COMPLETE_TYPE_P (bltn_type))
return;
{
tree binfo = NULL_TREE;
datum = build_scoped_ref (datum, basetype, &binfo);
- return build_x_component_ref (datum, field, binfo, 1);
+ return build_x_component_ref (datum, field, binfo);
}
return error_mark_node;
}
never have REFERENCE_TYPE. */
tree
-build_x_component_ref (datum, component, basetype_path, protect)
+build_x_component_ref (datum, component, basetype_path)
tree datum, component, basetype_path;
- int protect;
{
- tree t = build_component_ref (datum, component, basetype_path, protect);
+ tree t = build_component_ref (datum, component, basetype_path,
+ /*protect=*/1);
if (! processing_template_decl)
t = convert_from_reference (t);