Commit b87692e5 by Mike Stump

91th Cygnus<->FSF quick merge

From-SVN: r14098
parent eaf95893
Sat May 17 10:48:31 1997 Jason Merrill <jason@yorick.cygnus.com>
* pt.c (instantiate_class_template): Oops.
Fri May 16 14:23:57 1997 Jason Merrill <jason@yorick.cygnus.com>
* cp-tree.def: Add TAG_DEFN.
* pt.c (tsubst_enum): New fn.
(instantiate_class_template): Use it.
(tsubst_expr): Support TAG_DEFN.
(tsubst): Support local enums.
(tsubst_copy): Likewise.
* decl.c (finish_enum): Likewise.
(start_enum): If this is a local enum, switch to permanent_obstack.
Wed May 14 19:08:28 1997 Mike Stump <mrs@cygnus.com>
* decl.c (store_parm_decls): Set last_parm_cleanup_insn here.
(finish_function): Put the base init code for constructors just
after the parm cleanup insns.
(struct cp_function): Add last_parm_cleanup_insn.
(push_cp_function_context): Likewise.
(pop_cp_function_context): Likewise.
Tue May 13 15:51:20 1997 Jason Merrill <jason@yorick.cygnus.com>
* pt.c (tsubst_copy): Handle BIT_NOT_EXPR.
Wed May 7 11:17:59 1997 Brendan Kehoe <brendan@lisa.cygnus.com>
* method.c (emit_thunk) [ASM_OUTPUT_MI_THUNK]: Build up the RTL
for THUNK_FNDECL before we switch to temporary allocation.
Mon May 5 14:46:53 1997 Jason Merrill <jason@yorick.cygnus.com> Mon May 5 14:46:53 1997 Jason Merrill <jason@yorick.cygnus.com>
* call.c (build_new_op): Handle null arg2 for ?:. * call.c (build_new_op): Handle null arg2 for ?:.
......
...@@ -152,3 +152,5 @@ DEFTREECODE (REF_BIND, "ref_bind", "e", 1) ...@@ -152,3 +152,5 @@ DEFTREECODE (REF_BIND, "ref_bind", "e", 1)
DEFTREECODE (USER_CONV, "user_conv", "e", 4) DEFTREECODE (USER_CONV, "user_conv", "e", 4)
DEFTREECODE (AMBIG_CONV, "ambig_conv", "e", 1) DEFTREECODE (AMBIG_CONV, "ambig_conv", "e", 1)
DEFTREECODE (RVALUE_CONV, "rvalue_conv", "e", 1) DEFTREECODE (RVALUE_CONV, "rvalue_conv", "e", 1)
DEFTREECODE (TAG_DEFN, "tag_defn", "e", 0)
...@@ -268,6 +268,12 @@ tree dtor_label; ...@@ -268,6 +268,12 @@ tree dtor_label;
static rtx last_dtor_insn; static rtx last_dtor_insn;
/* In a constructor, the last insn emitted after the start of the
function and the parms, but before the start of the exception
specification. */
static rtx last_parm_cleanup_insn;
/* In a constructor, the point at which we are ready to return /* In a constructor, the point at which we are ready to return
the pointer to the initialized object. */ the pointer to the initialized object. */
...@@ -10579,6 +10585,9 @@ start_enum (name) ...@@ -10579,6 +10585,9 @@ start_enum (name)
register tree enumtype = NULL_TREE; register tree enumtype = NULL_TREE;
struct binding_level *b = inner_binding_level; struct binding_level *b = inner_binding_level;
if (processing_template_decl && current_function_decl)
end_temporary_allocation ();
/* If this is the real definition for a previous forward reference, /* If this is the real definition for a previous forward reference,
fill in the contents in the same object that used to be the fill in the contents in the same object that used to be the
forward reference. */ forward reference. */
...@@ -10657,7 +10666,14 @@ finish_enum (enumtype, values) ...@@ -10657,7 +10666,14 @@ finish_enum (enumtype, values)
TYPE_VALUES (enumtype) = nreverse (values); TYPE_VALUES (enumtype) = nreverse (values);
if (processing_template_decl) if (processing_template_decl)
return enumtype; {
if (current_function_decl)
{
add_tree (build_min (TAG_DEFN, enumtype));
resume_temporary_allocation ();
}
return enumtype;
}
{ {
int unsignedp = tree_int_cst_sgn (minnode) >= 0; int unsignedp = tree_int_cst_sgn (minnode) >= 0;
...@@ -11417,6 +11433,8 @@ store_parm_decls () ...@@ -11417,6 +11433,8 @@ store_parm_decls ()
expand_start_bindings (0); expand_start_bindings (0);
} }
last_parm_cleanup_insn = get_last_insn ();
if (! processing_template_decl && flag_exceptions) if (! processing_template_decl && flag_exceptions)
{ {
/* Do the starting of the exception specifications, if we have any. */ /* Do the starting of the exception specifications, if we have any. */
...@@ -11819,19 +11837,9 @@ finish_function (lineno, call_poplevel, nested) ...@@ -11819,19 +11837,9 @@ finish_function (lineno, call_poplevel, nested)
insns = get_insns (); insns = get_insns ();
end_sequence (); end_sequence ();
/* This is where the body of the constructor begins. /* This is where the body of the constructor begins. */
If there were no insns in this function body, then the
last_parm_insn is also the last insn.
If optimization is enabled, last_parm_insn may move, so
we don't hold on to it (across emit_base_init). */
last_parm_insn = get_first_nonparm_insn ();
if (last_parm_insn == NULL_RTX)
last_parm_insn = get_last_insn ();
else
last_parm_insn = previous_insn (last_parm_insn);
emit_insns_after (insns, last_parm_insn); emit_insns_after (insns, last_parm_cleanup_insn);
end_protect_partials (); end_protect_partials ();
...@@ -12480,6 +12488,7 @@ struct cp_function ...@@ -12480,6 +12488,7 @@ struct cp_function
tree ctor_label; tree ctor_label;
tree dtor_label; tree dtor_label;
rtx last_dtor_insn; rtx last_dtor_insn;
rtx last_parm_cleanup_insn;
tree base_init_list; tree base_init_list;
tree member_init_list; tree member_init_list;
tree base_init_expr; tree base_init_expr;
...@@ -12518,6 +12527,7 @@ push_cp_function_context (context) ...@@ -12518,6 +12527,7 @@ push_cp_function_context (context)
p->ctor_label = ctor_label; p->ctor_label = ctor_label;
p->dtor_label = dtor_label; p->dtor_label = dtor_label;
p->last_dtor_insn = last_dtor_insn; p->last_dtor_insn = last_dtor_insn;
p->last_parm_cleanup_insn = last_parm_cleanup_insn;
p->assigns_this = current_function_assigns_this; p->assigns_this = current_function_assigns_this;
p->just_assigned_this = current_function_just_assigned_this; p->just_assigned_this = current_function_just_assigned_this;
p->parms_stored = current_function_parms_stored; p->parms_stored = current_function_parms_stored;
...@@ -12558,6 +12568,7 @@ pop_cp_function_context (context) ...@@ -12558,6 +12568,7 @@ pop_cp_function_context (context)
ctor_label = p->ctor_label; ctor_label = p->ctor_label;
dtor_label = p->dtor_label; dtor_label = p->dtor_label;
last_dtor_insn = p->last_dtor_insn; last_dtor_insn = p->last_dtor_insn;
last_parm_cleanup_insn = p->last_parm_cleanup_insn;
current_function_assigns_this = p->assigns_this; current_function_assigns_this = p->assigns_this;
current_function_just_assigned_this = p->just_assigned_this; current_function_just_assigned_this = p->just_assigned_this;
current_function_parms_stored = p->parms_stored; current_function_parms_stored = p->parms_stored;
......
...@@ -1674,10 +1674,9 @@ make_thunk (function, delta) ...@@ -1674,10 +1674,9 @@ make_thunk (function, delta)
int delta; int delta;
{ {
char buffer[250]; char buffer[250];
tree thunk_fndecl, thunk_id; tree thunk_id;
tree thunk; tree thunk;
char *func_name; char *func_name;
static int thunk_number = 0;
tree func_decl; tree func_decl;
if (TREE_CODE (function) != ADDR_EXPR) if (TREE_CODE (function) != ADDR_EXPR)
abort (); abort ();
...@@ -1739,10 +1738,12 @@ emit_thunk (thunk_fndecl) ...@@ -1739,10 +1738,12 @@ emit_thunk (thunk_fndecl)
#ifdef ASM_OUTPUT_MI_THUNK #ifdef ASM_OUTPUT_MI_THUNK
char *fnname; char *fnname;
current_function_decl = thunk_fndecl; current_function_decl = thunk_fndecl;
/* Make sure we build up its RTL before we go onto the
temporary obstack. */
make_function_rtl (thunk_fndecl);
temporary_allocation (); temporary_allocation ();
DECL_RESULT (thunk_fndecl) DECL_RESULT (thunk_fndecl)
= build_decl (RESULT_DECL, 0, integer_type_node); = build_decl (RESULT_DECL, 0, integer_type_node);
make_function_rtl (thunk_fndecl);
fnname = XSTR (XEXP (DECL_RTL (thunk_fndecl), 0), 0); fnname = XSTR (XEXP (DECL_RTL (thunk_fndecl), 0), 0);
assemble_start_function (thunk_fndecl, fnname); assemble_start_function (thunk_fndecl, fnname);
ASM_OUTPUT_MI_THUNK (asm_out_file, thunk_fndecl, delta, function); ASM_OUTPUT_MI_THUNK (asm_out_file, thunk_fndecl, delta, function);
......
...@@ -72,6 +72,7 @@ static int comp_template_args PROTO((tree, tree)); ...@@ -72,6 +72,7 @@ static int comp_template_args PROTO((tree, tree));
tree most_specialized_class PROTO((tree, tree)); tree most_specialized_class PROTO((tree, tree));
static tree get_class_bindings PROTO((tree, tree, tree)); static tree get_class_bindings PROTO((tree, tree, tree));
tree make_temp_vec PROTO((int)); tree make_temp_vec PROTO((int));
static tree tsubst_enum PROTO((tree, tree *, int));
/* We've got a template header coming up; push to a new level for storing /* We've got a template header coming up; push to a new level for storing
the parms. */ the parms. */
...@@ -1198,36 +1199,22 @@ instantiate_class_template (type) ...@@ -1198,36 +1199,22 @@ instantiate_class_template (type)
{ {
tree name = TREE_PURPOSE (t); tree name = TREE_PURPOSE (t);
tree tag = TREE_VALUE (t); tree tag = TREE_VALUE (t);
tree newtag;
/* These will add themselves to CLASSTYPE_TAGS for the new type. */ /* These will add themselves to CLASSTYPE_TAGS for the new type. */
if (TREE_CODE (tag) == ENUMERAL_TYPE) if (TREE_CODE (tag) == ENUMERAL_TYPE)
newtag = start_enum (name);
else
newtag = tsubst (tag, &TREE_VEC_ELT (args, 0),
TREE_VEC_LENGTH (args), NULL_TREE);
if (TREE_CODE (tag) == ENUMERAL_TYPE)
{ {
tree e, values = NULL_TREE, *last = &values; tree e, newtag = tsubst_enum (tag, &TREE_VEC_ELT (args, 0),
TREE_VEC_LENGTH (args));
for (e = TYPE_VALUES (tag); e; e = TREE_CHAIN (e)) for (e = TYPE_VALUES (newtag); e; e = TREE_CHAIN (e))
{ DECL_FIELD_CONTEXT (TREE_VALUE (e)) = type;
tree elt = build_enumerator
(TREE_PURPOSE (e),
tsubst_expr (TREE_VALUE (e), &TREE_VEC_ELT (args, 0),
TREE_VEC_LENGTH (args), NULL_TREE));
DECL_FIELD_CONTEXT (TREE_VALUE (elt)) = type;
*last = elt;
last = &TREE_CHAIN (elt);
}
finish_enum (newtag, values);
*field_chain = grok_enum_decls (newtag, NULL_TREE); *field_chain = grok_enum_decls (newtag, NULL_TREE);
while (*field_chain) while (*field_chain)
field_chain = &TREE_CHAIN (*field_chain); field_chain = &TREE_CHAIN (*field_chain);
} }
else
tsubst (tag, &TREE_VEC_ELT (args, 0),
TREE_VEC_LENGTH (args), NULL_TREE);
} }
/* Don't replace enum constants here. */ /* Don't replace enum constants here. */
...@@ -1411,6 +1398,8 @@ tsubst (t, args, nargs, in_decl) ...@@ -1411,6 +1398,8 @@ tsubst (t, args, nargs, in_decl)
tree ctx = tsubst (TYPE_CONTEXT (t), args, nargs, in_decl); tree ctx = tsubst (TYPE_CONTEXT (t), args, nargs, in_decl);
if (ctx == NULL_TREE) if (ctx == NULL_TREE)
return t; return t;
else if (ctx == current_function_decl)
return lookup_name (TYPE_IDENTIFIER (t), 1);
else else
return lookup_nested_type_by_name (ctx, TYPE_IDENTIFIER (t)); return lookup_nested_type_by_name (ctx, TYPE_IDENTIFIER (t));
} }
...@@ -2000,7 +1989,9 @@ tsubst_copy (t, args, nargs, in_decl) ...@@ -2000,7 +1989,9 @@ tsubst_copy (t, args, nargs, in_decl)
if (DECL_CONTEXT (t)) if (DECL_CONTEXT (t))
{ {
tree ctx = tsubst (DECL_CONTEXT (t), args, nargs, in_decl); tree ctx = tsubst (DECL_CONTEXT (t), args, nargs, in_decl);
if (ctx != DECL_CONTEXT (t)) if (ctx == current_function_decl)
return lookup_name (DECL_NAME (t), 0);
else if (ctx != DECL_CONTEXT (t))
return lookup_field (ctx, DECL_NAME (t), 0, 0); return lookup_field (ctx, DECL_NAME (t), 0, 0);
} }
return t; return t;
...@@ -2033,6 +2024,7 @@ tsubst_copy (t, args, nargs, in_decl) ...@@ -2033,6 +2024,7 @@ tsubst_copy (t, args, nargs, in_decl)
case POSTINCREMENT_EXPR: case POSTINCREMENT_EXPR:
case NEGATE_EXPR: case NEGATE_EXPR:
case TRUTH_NOT_EXPR: case TRUTH_NOT_EXPR:
case BIT_NOT_EXPR:
case ADDR_EXPR: case ADDR_EXPR:
case CONVERT_EXPR: /* Unary + */ case CONVERT_EXPR: /* Unary + */
case SIZEOF_EXPR: case SIZEOF_EXPR:
...@@ -2491,6 +2483,13 @@ tsubst_expr (t, args, nargs, in_decl) ...@@ -2491,6 +2483,13 @@ tsubst_expr (t, args, nargs, in_decl)
do_poplevel (); do_poplevel ();
break; break;
case TAG_DEFN:
lineno = TREE_COMPLEXITY (t);
t = TREE_TYPE (t);
if (TREE_CODE (t) == ENUMERAL_TYPE)
tsubst_enum (t, args, nargs);
break;
default: default:
return build_expr_from_tree (tsubst_copy (t, args, nargs, in_decl)); return build_expr_from_tree (tsubst_copy (t, args, nargs, in_decl));
} }
...@@ -3578,3 +3577,28 @@ add_maybe_template (d, fns) ...@@ -3578,3 +3577,28 @@ add_maybe_template (d, fns)
maybe_template_tail = &TREE_CHAIN (*maybe_template_tail); maybe_template_tail = &TREE_CHAIN (*maybe_template_tail);
DECL_MAYBE_TEMPLATE (d) = 1; DECL_MAYBE_TEMPLATE (d) = 1;
} }
/* Instantiate an enumerated type. Used by instantiate_class_template and
tsubst_expr. */
static tree
tsubst_enum (tag, args, nargs)
tree tag, *args;
int nargs;
{
tree newtag = start_enum (TYPE_IDENTIFIER (tag));
tree e, values = NULL_TREE;
for (e = TYPE_VALUES (tag); e; e = TREE_CHAIN (e))
{
tree elt = build_enumerator (TREE_PURPOSE (e),
tsubst_expr (TREE_VALUE (e), args,
nargs, NULL_TREE));
TREE_CHAIN (elt) = values;
values = elt;
}
finish_enum (newtag, values);
return newtag;
}
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