cp-tree.h (DECL_CLONED_FUNCTION_P): Check DECL_LANG_SPECIFIC.
authorMark Mitchell <mark@codesourcery.com>
Wed, 23 Aug 2000 17:12:23 +0000 (17:12 +0000)
committerMark Mitchell <mmitchel@gcc.gnu.org>
Wed, 23 Aug 2000 17:12:23 +0000 (17:12 +0000)
* 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
gcc/cp/cp-tree.h
gcc/cp/mangle.c
gcc/cp/pt.c

index 174263e74f3b147a312c842cbc6b71a02e79c469..ae35173e9f9fcd2cb48f33a04534b97fdc952a02 100644 (file)
@@ -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
index 9bfef2c948d1c18bd294e534c53a1ceea8c58758..8ccb19bcaff6c1df540a2e48aaa6ac98e050bcec 100644 (file)
@@ -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.  */
index c5601185e41b8903492262c463028f935f6994f6..9ca7178e08fe7ce690960ebd004c0984fb5700b9 100644 (file)
@@ -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');
 }
 
index 5fab8485c84e777e07cbcec61a29e9fe4a80bf43..59fe306fb18d42b200df12ad22d53f36ac280254 100644 (file)
@@ -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;
 }