parse.y (named_class_head): Push into class while parsing the base class list.
authorMartin v. Löwis <loewis@informatik.hu-berlin.de>
Thu, 22 Oct 1998 14:52:02 +0000 (14:52 +0000)
committerMartin v. Löwis <loewis@gcc.gnu.org>
Thu, 22 Oct 1998 14:52:02 +0000 (14:52 +0000)
* 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

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

index f2be60cb0c90a22f27081b199d346e2073346fe6..e614e723c25596e9531d089a77d29a359cd4b269 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 d49932750916fd618daa25d597f88642d06a8baf..51c531bb558e8722946b55a965f8757df36c9b08 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 f0b3167ab27ab280e1484210365129f3a17c37ac..302138ab2d24df391f6dea9c294078c8cfdad351 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 d654f5a90cc12179ce1e85e94b026f9051dfd720..2aba4a5fea01d7f0125e6c3c935d4a23d9f88575 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); 
                    }
                }
        ;