cp-tree.def (DEFAULT_ARG): Adjust documentation.
authorNathan Sidwell <nathan@gcc.gnu.org>
Tue, 7 Jun 2005 11:56:11 +0000 (11:56 +0000)
committerNathan Sidwell <nathan@gcc.gnu.org>
Tue, 7 Jun 2005 11:56:11 +0000 (11:56 +0000)
* cp-tree.def (DEFAULT_ARG): Adjust documentation.
* cp-tree.h (DEFARG_INSTANTIATIONS): New.
(struct tree_default_arg): Add instantiations member.
* parser.c (cp_parser_late_parsing_default_args): Adjust to use a
VEC.
* pt.c (tsubst_arg_types): Likewise.

From-SVN: r100707

gcc/cp/cp-tree.def
gcc/cp/cp-tree.h
gcc/cp/parser.c
gcc/cp/pt.c

index 27284675e61fa46a8e77d6057c9e566d7b0e6fb8..aa0ea83b3230d60c27d306c3c3c1d96d2a69db6e 100644 (file)
@@ -206,9 +206,9 @@ DEFTREECODE (USING_DECL, "using_decl", tcc_declaration, 0)
 /* A using directive. The operand is USING_STMT_NAMESPACE.  */     
 DEFTREECODE (USING_STMT, "using_directive", tcc_statement, 1)
 
-/* An un-parsed default argument.  Looks like an IDENTIFIER_NODE.
-   TREE_CHAIN is used to hold instantiations of functions that had to
-   be instantiated before the argument was parsed.  */
+/* An un-parsed default argument.  Holds a vector of input tokens and
+   a vector of places where the argument was instantiated before
+   parsing had occurred.  */
 DEFTREECODE (DEFAULT_ARG, "default_arg", tcc_exceptional, 0)
 
 /* A template-id, like foo<int>.  The first operand is the template.
index 6cf7fa052f059bb4786e30bfa01d1242814bba69..90de20c1e63230bdc7f0b9cbad3416e320169793 100644 (file)
@@ -424,11 +424,14 @@ typedef enum cp_id_kind
 
 #define DEFARG_TOKENS(NODE) \
   (((struct tree_default_arg *)DEFAULT_ARG_CHECK (NODE))->tokens)
+#define DEFARG_INSTANTIATIONS(NODE) \
+  (((struct tree_default_arg *)DEFAULT_ARG_CHECK (NODE))->instantiations)
 
 struct tree_default_arg GTY (())
 {
   struct tree_common common;
   struct cp_token_cache *tokens;
+  VEC(tree,gc) *instantiations;
 };
 
 enum cp_tree_node_structure_enum {
index 23c1621cebef6b7f92a4bac8ca9690be43630f08..24cb027d32713e838c74627e9b19efe83ca73ca0 100644 (file)
@@ -12145,7 +12145,8 @@ cp_parser_parameter_declaration (cp_parser *parser,
              argument.  */
          default_argument = make_node (DEFAULT_ARG);
          DEFARG_TOKENS (default_argument)
-           = cp_token_cache_new (first_token, token);  
+           = cp_token_cache_new (first_token, token);
+         DEFARG_INSTANTIATIONS (default_argument) = NULL;
        }
       /* Outside of a class definition, we can just parse the
          assignment-expression.  */
@@ -15595,6 +15596,9 @@ cp_parser_late_parsing_default_args (cp_parser *parser, tree fn)
       cp_token_cache *tokens;
       tree default_arg = TREE_PURPOSE (parm);
       tree parsed_arg;
+      VEC(tree,gc) *insts;
+      tree copy;
+      unsigned ix;
       
       if (!default_arg)
        continue;
@@ -15615,10 +15619,9 @@ cp_parser_late_parsing_default_args (cp_parser *parser, tree fn)
       TREE_PURPOSE (parm) = parsed_arg;
 
       /* Update any instantiations we've already created.  */
-      for (default_arg = TREE_CHAIN (default_arg);
-          default_arg;
-          default_arg = TREE_CHAIN (default_arg))
-       TREE_PURPOSE (TREE_PURPOSE (default_arg)) = parsed_arg;
+      for (insts = DEFARG_INSTANTIATIONS (default_arg), ix = 0;
+          VEC_iterate (tree, insts, ix, copy); ix++)
+       TREE_PURPOSE (copy) = parsed_arg;
 
       /* If the token stream has not been completely used up, then
         there was extra junk after the end of the default
index 7924bbee97568f0558a14189ae3bf6a91bc6be52..f7eb93576ec1b00d2ce1e0f3945587cadde63d05 100644 (file)
@@ -6745,8 +6745,7 @@ tsubst_arg_types (tree arg_types,
         class, and is not an error unless we require the default
         argument in a call of this function.  */
       result = tree_cons (default_arg, type, remaining_arg_types);
-      TREE_CHAIN (default_arg) = tree_cons (result, NULL_TREE,
-                                           TREE_CHAIN (default_arg));
+      VEC_safe_push (tree, gc, DEFARG_INSTANTIATIONS (default_arg), result);
     }
   else
     result = hash_tree_cons (default_arg, type, remaining_arg_types);