aboutsummaryrefslogtreecommitdiff
path: root/gcc/cp
diff options
context:
space:
mode:
authorJason Merrill <jason@yorick.cygnus.com>1998-07-23 02:29:34 +0000
committerJason Merrill <jason@gcc.gnu.org>1998-07-22 22:29:34 -0400
commit67f7c3918150e70c096d69d563c4bc01f22b3793 (patch)
treee4ff50d1659a906f2d15e18dc6ec669ec8964826 /gcc/cp
parent1af1ed70350cb1ead004cbad75069e683b9a5d9a (diff)
downloadgcc-67f7c3918150e70c096d69d563c4bc01f22b3793.zip
gcc-67f7c3918150e70c096d69d563c4bc01f22b3793.tar.gz
gcc-67f7c3918150e70c096d69d563c4bc01f22b3793.tar.bz2
class.c (build_vtable): Pass at_eof to import_export_vtable.
* 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
Diffstat (limited to 'gcc/cp')
-rw-r--r--gcc/cp/ChangeLog13
-rw-r--r--gcc/cp/class.c9
-rw-r--r--gcc/cp/decl.c4
-rw-r--r--gcc/cp/decl2.c18
-rw-r--r--gcc/cp/rtti.c11
5 files changed, 47 insertions, 8 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 5cf66bf..06e62e5 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -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 ().
diff --git a/gcc/cp/class.c b/gcc/cp/class.c
index 1c98b3b..714aad6 100644
--- a/gcc/cp/class.c
+++ b/gcc/cp/class.c
@@ -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);
diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c
index 986b8c0..51835de 100644
--- a/gcc/cp/decl.c
+++ b/gcc/cp/decl.c
@@ -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)
diff --git a/gcc/cp/decl2.c b/gcc/cp/decl2.c
index e484e6d..270c2fd 100644
--- a/gcc/cp/decl2.c
+++ b/gcc/cp/decl2.c
@@ -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;
}
diff --git a/gcc/cp/rtti.c b/gcc/cp/rtti.c
index d452e03..0750fa3 100644
--- a/gcc/cp/rtti.c
+++ b/gcc/cp/rtti.c
@@ -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);