parse.y (named_class_head): Push into class while parsing the base class list.

* parse.y (named_class_head): Push into class while parsing the
	base class list.
	* decl2.c (push_scope, pop_scope): New functions.
	* tree.h: Declare them.

From-SVN: r23224
This commit is contained in:
Martin v. Löwis 1998-10-22 14:52:02 +00:00 committed by Martin v. Löwis
parent e0afe616d4
commit f09bbbedfb
4 changed files with 39 additions and 4 deletions

View File

@ -1,5 +1,9 @@
1998-10-22 Martin v. Löwis <loewis@informatik.hu-berlin.de>
1998-10-22 Martin von Löwis <loewis@informatik.hu-berlin.de>
* parse.y (named_class_head): Push into class while parsing the
base class list.
* decl2.c (push_scope, pop_scope): New functions.
* cp-tree.h: Declare them.
* init.c (build_new_1): Delay cleanup until end of full expression.
1998-10-21 Jason Merrill <jason@yorick.cygnus.com>

View File

@ -2668,6 +2668,8 @@ extern void set_decl_namespace PROTO((tree, tree));
extern tree current_decl_namespace PROTO((void));
extern void push_decl_namespace PROTO((tree));
extern void pop_decl_namespace PROTO((void));
extern void push_scope PROTO((tree));
extern void pop_scope PROTO((tree));
extern void do_namespace_alias PROTO((tree, tree));
extern void do_toplevel_using_decl PROTO((tree));
extern void do_local_using_decl PROTO((tree));

View File

@ -4332,6 +4332,30 @@ check_decl_namespace ()
my_friendly_assert (decl_namespace_list == NULL_TREE, 980711);
}
/* Enter a class or namespace scope. */
void
push_scope (t)
tree t;
{
if (TREE_CODE (t) == NAMESPACE_DECL)
push_decl_namespace (t);
else
pushclass (t, 2);
}
/* Leave scope pushed by push_scope. */
void
pop_scope (t)
tree t;
{
if (TREE_CODE (t) == NAMESPACE_DECL)
pop_decl_namespace ();
else
popclass (1);
}
/* [basic.lookup.koenig] */
/* A non-zero return value in the functions below indicates an error.
All nodes allocated in the procedure are on the scratch obstack. */

View File

@ -2235,14 +2235,19 @@ named_class_head:
{ $$ = xref_tag (current_aggr, $1, 1); }
| named_class_head_sans_basetype_defn
{ $<ttype>$ = xref_tag (current_aggr, $1, 0); }
/* Class name is unqualified, so we look for base classes
in the current scope. */
maybe_base_class_list %prec EMPTY
{
$$ = $<ttype>2;
if ($3)
xref_basetypes (current_aggr, $1, $<ttype>2, $3);
}
| named_complex_class_head_sans_basetype maybe_base_class_list
| named_complex_class_head_sans_basetype
{ push_scope (CP_DECL_CONTEXT ($1)); }
maybe_base_class_list
{
pop_scope (CP_DECL_CONTEXT ($1));
$$ = TREE_TYPE ($1);
if (TREE_INT_CST_LOW (current_aggr) == union_type
&& TREE_CODE ($$) != UNION_TYPE)
@ -2250,10 +2255,10 @@ named_class_head:
else if (TREE_CODE ($$) == UNION_TYPE
&& TREE_INT_CST_LOW (current_aggr) != union_type)
cp_pedwarn ("non-`union' tag used in declaring `%#T'", $$);
if ($2)
if ($3)
{
maybe_process_partial_specialization ($$);
xref_basetypes (current_aggr, $1, $$, $2);
xref_basetypes (current_aggr, $1, $$, $3);
}
}
;