diff options
author | Jason Merrill <jason@yorick.cygnus.com> | 1998-07-23 02:29:34 +0000 |
---|---|---|
committer | Jason Merrill <jason@gcc.gnu.org> | 1998-07-22 22:29:34 -0400 |
commit | 67f7c3918150e70c096d69d563c4bc01f22b3793 (patch) | |
tree | e4ff50d1659a906f2d15e18dc6ec669ec8964826 /gcc/cp | |
parent | 1af1ed70350cb1ead004cbad75069e683b9a5d9a (diff) | |
download | gcc-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/ChangeLog | 13 | ||||
-rw-r--r-- | gcc/cp/class.c | 9 | ||||
-rw-r--r-- | gcc/cp/decl.c | 4 | ||||
-rw-r--r-- | gcc/cp/decl2.c | 18 | ||||
-rw-r--r-- | gcc/cp/rtti.c | 11 |
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); |