aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorMark Mitchell <mark@codesourcery.com>2000-08-23 17:12:23 +0000
committerMark Mitchell <mmitchel@gcc.gnu.org>2000-08-23 17:12:23 +0000
commit94350948fbd3d9e2157f2e39903c78ca0661a25b (patch)
tree3b18de0b9496900a925203d22eada82d35fb45e4 /gcc
parente282c9c9f5ab1e633571d3ded6e15a81beb690cc (diff)
downloadgcc-94350948fbd3d9e2157f2e39903c78ca0661a25b.zip
gcc-94350948fbd3d9e2157f2e39903c78ca0661a25b.tar.gz
gcc-94350948fbd3d9e2157f2e39903c78ca0661a25b.tar.bz2
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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/ChangeLog10
-rw-r--r--gcc/cp/cp-tree.h5
-rw-r--r--gcc/cp/mangle.c18
-rw-r--r--gcc/cp/pt.c8
4 files changed, 31 insertions, 10 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 174263e..ae35173 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,13 @@
+2000-08-23 Mark Mitchell <mark@codesourcery.com>
+
+ * 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 <gdr@codesourcery.com>
* 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 9bfef2c..8ccb19b 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 c5601185..9ca7178 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 <function-type>. 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.
<function-type> ::= F [Y] <bare-function-type> 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 5fab848..59fe306 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;
}