class.c (build_vtable): Pass at_eof to import_export_vtable.
authorJason Merrill <jason@yorick.cygnus.com>
Thu, 23 Jul 1998 02:29:34 +0000 (02:29 +0000)
committerJason Merrill <jason@gcc.gnu.org>
Thu, 23 Jul 1998 02:29:34 +0000 (22:29 -0400)
* class.c (build_vtable): Pass at_eof to import_export_vtable.
(prepare_fresh_vtable): Likewise.
* decl2.c (import_export_class): Split out...
(finish_prevtable_vardecl): From here.
* class.c (finish_struct_1): Call import_export_class if at_eof.
* decl.c (start_function): #if 0 mysterious code I wrote and have
forgotten why.
* rtti.c (get_tinfo_fn): If this is for a class type, set
DECL_CONTEXT.

From-SVN: r21345

gcc/cp/ChangeLog
gcc/cp/class.c
gcc/cp/decl.c
gcc/cp/decl2.c
gcc/cp/rtti.c

index 5cf66bf96a071516d839928de367d4443087ed96..06e62e57fd798532ccd35c15f7aeed08f0d71fab 100644 (file)
@@ -1,3 +1,16 @@
+1998-07-23  Jason Merrill  <jason@yorick.cygnus.com>
+
+       * class.c (build_vtable): Pass at_eof to import_export_vtable.
+       (prepare_fresh_vtable): Likewise.
+       * decl2.c (import_export_class): Split out...
+       (finish_prevtable_vardecl): From here.
+       * class.c (finish_struct_1): Call import_export_class if at_eof.
+
+       * decl.c (start_function): #if 0 mysterious code I wrote and have 
+       forgotten why.
+       * rtti.c (get_tinfo_fn): If this is for a class type, set
+       DECL_CONTEXT.
+
 1998-07-22  Jason Merrill  <jason@yorick.cygnus.com>
 
        * inc/exception: Change terminate and unexpected to ().
index 1c98b3b4e4d4be665819d373da65bb5462ef7bd6..714aad64225b2beb4f72d8d3e3b49a60b291777b 100644 (file)
@@ -704,7 +704,7 @@ build_vtable (binfo, type)
 #endif
 
   /* Set TREE_PUBLIC and TREE_EXTERN as appropriate.  */
-  import_export_vtable (decl, type, 0);
+  import_export_vtable (decl, type, at_eof);
 
   decl = pushdecl_top_level (decl);
   SET_IDENTIFIER_GLOBAL_VALUE (name, decl);
@@ -890,7 +890,7 @@ prepare_fresh_vtable (binfo, for_type)
 #endif
 
   /* Set TREE_PUBLIC and TREE_EXTERN as appropriate.  */
-  import_export_vtable (new_decl, for_type, 0);
+  import_export_vtable (new_decl, for_type, at_eof);
 
   if (TREE_VIA_VIRTUAL (binfo))
     my_friendly_assert (binfo == binfo_member (BINFO_TYPE (binfo),
@@ -3943,6 +3943,11 @@ finish_struct_1 (t, warn_anon)
   if (max_has_virtual > 0)
     TYPE_VIRTUAL_P (t) = 1;
 
+  /* Do this here before we start messing with vtables so that we are ready
+     for import_export_vtable.  */
+  if (at_eof)
+    import_export_class (t);
+
   if (flag_rtti && TYPE_VIRTUAL_P (t) && !pending_hard_virtuals)
     modify_all_vtables (t, NULL_TREE, NULL_TREE);
 
index 986b8c0533673a3a10a89c0e6a6cdd9a1f63bb25..51835de5ea779376123f5146206ef35c4a87569c 100644 (file)
@@ -11959,8 +11959,11 @@ start_function (declspecs, declarator, attrs, pre_parsed_p)
     {
       decl1 = declarator;
 
+#if 0
+      /* What was this testing for, exactly?  */
       if (! DECL_ARGUMENTS (decl1)
          && !DECL_STATIC_FUNCTION_P (decl1)
+         && !DECL_ARTIFICIAL (decl1)
          && DECL_CLASS_SCOPE_P (decl1)
          && TYPE_IDENTIFIER (DECL_CONTEXT (decl1))
          && IDENTIFIER_TEMPLATE (TYPE_IDENTIFIER (DECL_CONTEXT (decl1))))
@@ -11973,6 +11976,7 @@ start_function (declspecs, declarator, attrs, pre_parsed_p)
          else if (BINDING_VALUE (binding))
            cp_error_at ("previous declaration here", BINDING_VALUE (binding));
        }
+#endif
 
       fntype = TREE_TYPE (decl1);
       if (TREE_CODE (fntype) == METHOD_TYPE)
index e484e6d4cf6724c443d5a053c4b07a2d6633ea69..270c2fd9a15818e0b9ad1f035fea86655ddc5c19 100644 (file)
@@ -2607,12 +2607,11 @@ import_export_template (type)
       CLASSTYPE_VTABLE_NEEDS_WRITING (type) = 0;
     }
 }
-    
-int
-finish_prevtable_vardecl (prev, vars)
-     tree prev, vars;
+
+void
+import_export_class (ctype)
+     tree ctype;
 {
-  tree ctype = DECL_CONTEXT (vars);
   import_export_template (ctype);
 
 #ifndef MULTIPLE_SYMBOL_SPACES
@@ -2636,7 +2635,14 @@ finish_prevtable_vardecl (prev, vars)
        }
     }
 #endif
-
+}
+    
+int
+finish_prevtable_vardecl (prev, vars)
+     tree prev, vars;
+{
+  tree ctype = DECL_CONTEXT (vars);
+  import_export_class (ctype);
   import_export_vtable (vars, ctype, 1);
   return 1;
 }
index d452e03efd10163142f94cfa16917be8c0cb7f17..0750fa3649bf32ee36479caca2da9e3da2c45167 100644 (file)
@@ -368,6 +368,17 @@ get_tinfo_fn (type)
   DECL_NOT_REALLY_EXTERN (d) = 1;
   DECL_MUTABLE_P (d) = 1;
   TREE_TYPE (name) = copy_to_permanent (type);
+
+  /* We set DECL_CONTEXT for the benefit of backend stuff that wants to
+     know what type this artificial function is associated with.  dllexport
+     handling, for instance.  This is a kludge, and the DECL_NO_STATIC_CHAIN
+     bit is necessary to keep local classes from breaking.  */
+  if (IS_AGGR_TYPE (type))
+    {
+      DECL_CONTEXT (d) = type;
+      DECL_NO_STATIC_CHAIN (d) = 1;
+    }
+
   pushdecl_top_level (d);
   make_function_rtl (d);
   assemble_external (d);