From 94350948fbd3d9e2157f2e39903c78ca0661a25b Mon Sep 17 00:00:00 2001 From: Mark Mitchell Date: Wed, 23 Aug 2000 17:12:23 +0000 Subject: [PATCH] cp-tree.h (DECL_CLONED_FUNCTION_P): Check DECL_LANG_SPECIFIC. * cp-tree.h (DECL_CLONED_FUNCTION_P): Check DECL_LANG_SPECIFIC. * mangle.c (write_function_type): Change prototype. (write_encoding): Don't mangle return types for constructors or destructors. (write_type): Adjust call to write_function_type. * pt.c (instantiate_template): Instantiate alternate entry points when instantiating the main function. From-SVN: r35916 --- gcc/cp/ChangeLog | 10 ++++++++++ gcc/cp/cp-tree.h | 5 +++-- gcc/cp/mangle.c | 18 ++++++++++-------- gcc/cp/pt.c | 8 ++++++++ 4 files changed, 31 insertions(+), 10 deletions(-) diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 174263e74f3..ae35173e9f9 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,13 @@ +2000-08-23 Mark Mitchell + + * cp-tree.h (DECL_CLONED_FUNCTION_P): Check DECL_LANG_SPECIFIC. + * mangle.c (write_function_type): Change prototype. + (write_encoding): Don't mangle return types for + constructors or destructors. + (write_type): Adjust call to write_function_type. + * pt.c (instantiate_template): Instantiate alternate entry points + when instantiating the main function. + 2000-08-23 Gabriel Dos Reis * error.c (cp_print_error_function): Don't use embedded '\n' in diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h index 9bfef2c948d..8ccb19bcaff 100644 --- a/gcc/cp/cp-tree.h +++ b/gcc/cp/cp-tree.h @@ -2010,8 +2010,9 @@ struct lang_decl /* Nonzero if NODE (a FUNCTION_DECL) is a cloned constructor or destructor. */ -#define DECL_CLONED_FUNCTION_P(NODE) \ - (DECL_CLONED_FUNCTION (NODE) != NULL_TREE) +#define DECL_CLONED_FUNCTION_P(NODE) \ + (DECL_LANG_SPECIFIC (NODE) \ + && DECL_CLONED_FUNCTION (NODE) != NULL_TREE) /* If DECL_CLONED_FUNCTION_P holds, this is the function that was cloned. */ diff --git a/gcc/cp/mangle.c b/gcc/cp/mangle.c index c5601185e41..9ca7178e08f 100644 --- a/gcc/cp/mangle.c +++ b/gcc/cp/mangle.c @@ -166,7 +166,7 @@ static void write_special_name_destructor PARAMS ((tree)); static void write_type PARAMS ((tree)); static int write_CV_qualifiers_for_type PARAMS ((tree)); static void write_builtin_type PARAMS ((tree)); -static void write_function_type PARAMS ((tree, int)); +static void write_function_type PARAMS ((tree)); static void write_bare_function_type PARAMS ((tree, int)); static void write_method_parms PARAMS ((tree, int)); static void write_class_enum_type PARAMS ((tree)); @@ -640,7 +640,10 @@ write_encoding (decl) else fn_type = TREE_TYPE (decl); - write_bare_function_type (fn_type, decl_is_template_id (decl, NULL)); + write_bare_function_type (fn_type, + (!DECL_CONSTRUCTOR_P (decl) + && !DECL_DESTRUCTOR_P (decl) + && decl_is_template_id (decl, NULL))); } } @@ -1247,7 +1250,7 @@ write_type (type) case FUNCTION_TYPE: case METHOD_TYPE: - write_function_type (type, 1); + write_function_type (type); break; case UNION_TYPE: @@ -1431,15 +1434,14 @@ write_builtin_type (type) } /* Non-terminal . NODE is a FUNCTION_TYPE or - METHOD_TYPE. If INCLUDE_RETURN_TYPE is non-zero, the return type - is mangled before the parameter types. + METHOD_TYPE. The return type is mangled before the parameter + types. ::= F [Y] E */ static void -write_function_type (type, include_return_type) +write_function_type (type) tree type; - int include_return_type; { MANGLE_TRACE_TREE ("function-type", type); @@ -1456,7 +1458,7 @@ write_function_type (type, include_return_type) extern "C" function_t f; // Vice versa. See [dcl.link]. */ - write_bare_function_type (type, include_return_type); + write_bare_function_type (type, /*include_return_type_p=*/1); write_char ('E'); } diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index 5fab8485c84..59fe306fb18 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -7420,6 +7420,7 @@ tree instantiate_template (tmpl, targ_ptr) tree tmpl, targ_ptr; { + tree clone; tree fndecl; tree gen_tmpl; tree spec; @@ -7483,6 +7484,13 @@ instantiate_template (tmpl, targ_ptr) if (flag_external_templates) add_pending_template (fndecl); + /* If we've just instantiated the main entry point for a function, + instantiate all the alternate entry points as well. */ + for (clone = TREE_CHAIN (gen_tmpl); + clone && DECL_CLONED_FUNCTION_P (clone); + clone = TREE_CHAIN (clone)) + instantiate_template (clone, targ_ptr); + return fndecl; } -- 2.30.2