OSDN Git Service

* parse.y (named_class_head): Push into class while parsing the
authorloewis <loewis@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 22 Oct 1998 14:52:02 +0000 (14:52 +0000)
committerloewis <loewis@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 22 Oct 1998 14:52:02 +0000 (14:52 +0000)
base class list.
* decl2.c (push_scope, pop_scope): New functions.
* tree.h: Declare them.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@23224 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/cp/ChangeLog
gcc/cp/cp-tree.h
gcc/cp/decl2.c
gcc/cp/parse.y

index f2be60c..e614e72 100644 (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>
index d499327..51c531b 100644 (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));
index f0b3167..302138a 100644 (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. */
index d654f5a..2aba4a5 100644 (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); 
                    }
                }
        ;