This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH 1/2] Use TEMPLATE_ID_TYPE in lieu of BOUND_TEMPLATE_TEMPLATE_PARM


On 12/09/2011 03:26 PM, Dodji Seketeli wrote:

Two overall comments:

1) Yeah, let's hold this for 4.8.
2) TEMPLATE_ID_TYPE in this patch is too closely related to BOUND_TEMPLATE_TEMPLATE_PARM; I'd like to see all the BOUND_TEMPLATE_TEMPLATE_PARM_P checks go away so that things know how to handle TEMPLATE_ID_TYPE and they know how to handle TEMPLATE_TEMPLATE_PARM, but the combination of the two is not handled specially.


  #define TEMPLATE_TYPE_PARM_INDEX(NODE)					\
    (TYPE_VALUES_RAW (TREE_CHECK3 ((NODE), TEMPLATE_TYPE_PARM,		\
  				 TEMPLATE_TEMPLATE_PARM,		\
-				 BOUND_TEMPLATE_TEMPLATE_PARM)))
+				 TEMPLATE_ID_TYPE)))

A TEMPLATE_ID_TYPE shouldn't have a parm index.


   /* Brings type template parameters to the canonical forms.  */
   if (code == TEMPLATE_TYPE_PARM || code == TEMPLATE_TEMPLATE_PARM
-      || code == BOUND_TEMPLATE_TEMPLATE_PARM)
+      || BOUND_TEMPLATE_TEMPLATE_PARM_P (parm))
     parm = TEMPLATE_TYPE_PARM_INDEX (parm);

Do we still need to handle this case here?


   /* Accept bound template template parameters.  */
   else if (allow_template_p
-	   && TREE_CODE (type) == BOUND_TEMPLATE_TEMPLATE_PARM)
+	   && BOUND_TEMPLATE_TEMPLATE_PARM_P (type))

Do we want to allow all TEMPLATE_ID_TYPE here?


       /* We can't apply any attributes to a completely unknown type until
 	 instantiation time.  */
       enum tree_code code = TREE_CODE (type);
-      if (code == TEMPLATE_TYPE_PARM
-	  || code == BOUND_TEMPLATE_TEMPLATE_PARM
+      if (BOUND_TEMPLATE_TEMPLATE_PARM_P (type)
+	  ||code == TEMPLATE_TYPE_PARM
 	  || code == TYPENAME_TYPE)

And here?


   /* Create lang_type structure.  */
   if (RECORD_OR_UNION_CODE_P (code)
-      || code == BOUND_TEMPLATE_TEMPLATE_PARM)
+      || code == TEMPLATE_ID_TYPE)

TEMPLATE_ID_TYPE doesn't need the whole 80 bytes of lang_type; it only needs one more tree outside of type_common. Since currently tree_code_size treats all types as being type_non_common, let's use TYPE_VALUES_RAW, TYPE_MINVAL, or TYPE_MAXVAL for TYPE_TEMPLATE_INFO of a TEMPLATE_ID_TYPE so it doesn't need TYPE_LANG_SPECIFIC at all.


 #define CLASSTYPE_TEMPLATE_ID_P(NODE)					\
   (TYPE_LANG_SPECIFIC (NODE) != NULL					\
-   && (TREE_CODE (NODE) == BOUND_TEMPLATE_TEMPLATE_PARM			\
+   && (BOUND_TEMPLATE_TEMPLATE_PARM_P (NODE)				\
        || (CLASSTYPE_TEMPLATE_INFO (NODE) != NULL			\
 	   && (PRIMARY_TEMPLATE_P (CLASSTYPE_TI_TEMPLATE (NODE))))))

I think that with alias templates this should be renamed to TYPE_TEMPLATE_ID_P, and it should support all TEMPLATE_ID_TYPE. And the first use of CLASSTYPE_TEMPLATE_ID_P should drop the CLASS_TYPE_P check.


   /* Handle template parameters.  */
   if (code == TEMPLATE_TYPE_PARM
       || code == TEMPLATE_TEMPLATE_PARM
-      || code == BOUND_TEMPLATE_TEMPLATE_PARM
+      || BOUND_TEMPLATE_TEMPLATE_PARM_P (expr)
       || code == TEMPLATE_PARM_INDEX)
     write_template_param (expr);
   /* Handle literals.  */
@@ -2995,9 +2995,10 @@ write_template_param (const tree parm)

   switch (TREE_CODE (parm))
     {
+    case TEMPLATE_ID_TYPE:
+      gcc_assert (BOUND_TEMPLATE_TEMPLATE_PARM_P (parm));
     case TEMPLATE_TYPE_PARM:
     case TEMPLATE_TEMPLATE_PARM:
-    case BOUND_TEMPLATE_TEMPLATE_PARM:
       parm_index = TEMPLATE_TYPE_IDX (parm);
       break;

We shouldn't need to handle TEMPLATE_ID_TYPE at all here; our normal handling of TEMPLATE_ID_TYPE should look through to the underlying TEMPLATE_TEMPLATE_PARM, and then that comes here.


-  if (TREE_CODE (parm) == BOUND_TEMPLATE_TEMPLATE_PARM)
+  if (BOUND_TEMPLATE_TEMPLATE_PARM_P (parm))
     {
-      templ
-	= TI_TEMPLATE (TEMPLATE_TEMPLATE_PARM_TEMPLATE_INFO (parm));
+      templ = TI_TEMPLATE (TYPE_TEMPLATE_INFO (parm));
       if (find_substitution (templ))
 	return;
     }

Likewise.


@@ -5330,7 +5330,7 @@ arg_assoc_type (struct arg_lookup *k, tree type)
       /* Associate the return type.  */
       return arg_assoc_type (k, TREE_TYPE (type));
     case TEMPLATE_TYPE_PARM:
-    case BOUND_TEMPLATE_TEMPLATE_PARM:
+    case TEMPLATE_ID_TYPE:
       return false;

This code was already wrong; as in arg_assoc_class, we should look at the associated namespaces of the template arguments.


-    case BOUND_TEMPLATE_TEMPLATE_PARM:
+    case TEMPLATE_ID_TYPE:
       /* Record template parameters such as `T' inside `TT<T>'.  */
       if (for_each_template_parm (TYPE_TI_ARGS (t), fn, data, pfd->visited,
 				  pfd->include_nondeduced_p))
 	return error_mark_node;
+
+      if (!BOUND_TEMPLATE_TEMPLATE_PARM_P (t))
+	break;
+
       /* Fall through.  */

Instead of falling through, the handling of TEMPLATE_ID_TYPE should walk into TYPE_TI_TEMPLATE.


     case TEMPLATE_TYPE_PARM:
     case TEMPLATE_TEMPLATE_PARM:
-    case BOUND_TEMPLATE_TEMPLATE_PARM:
+    case TEMPLATE_ID_TYPE:
     case TEMPLATE_PARM_INDEX:

TEMPLATE_ID_TYPE should get its own case, and we should be able to handle template template parms and other uses the same way.


@@ -15851,7 +15891,7 @@ template_parm_level_and_index (tree parm, int* level, int* index)
 {
   if (TREE_CODE (parm) == TEMPLATE_TYPE_PARM
       || TREE_CODE (parm) == TEMPLATE_TEMPLATE_PARM
-      || TREE_CODE (parm) == BOUND_TEMPLATE_TEMPLATE_PARM)
+      || BOUND_TEMPLATE_TEMPLATE_PARM_P (parm))

And we shouldn't need to handle it here.


@@ -16216,9 +16256,10 @@ unify (tree tparms, tree targs, tree parm, tree arg, int strict,
 	 within the nested-name-specifier.  */
       return unify_success (explain_p);

+    case TEMPLATE_ID_TYPE:
+      gcc_assert (BOUND_TEMPLATE_TEMPLATE_PARM_P (parm));

And it should get its own code here, since presumably we can deduce template arguments from the non-bound-template-template-parm usage as well.


+    case TEMPLATE_ID_TYPE:
+      if (BOUND_TEMPLATE_TEMPLATE_PARM_P (node))
+	/* Fall through.  */;
+      else
+	break;

Own code.


   if (TREE_CODE (type) == TEMPLATE_TYPE_PARM
-      || TREE_CODE (type) == BOUND_TEMPLATE_TEMPLATE_PARM
+      || BOUND_TEMPLATE_TEMPLATE_PARM_P (type)
       || TREE_CODE (type) == TYPENAME_TYPE)

This should allow all TEMPLATE_ID_TYPE.


@@ -1129,7 +1129,7 @@ comp_template_parms_position (tree t1, tree t2)
   tree index1, index2;
   gcc_assert (t1 && t2
 	      && TREE_CODE (t1) == TREE_CODE (t2)
-	      && (TREE_CODE (t1) == BOUND_TEMPLATE_TEMPLATE_PARM
+	      && (BOUND_TEMPLATE_TEMPLATE_PARM_P (t1)
 		  || TREE_CODE (t1) == TEMPLATE_TEMPLATE_PARM
 		  || TREE_CODE (t1) == TEMPLATE_TYPE_PARM));

Shouldn't need to handle any TEMPLATE_ID_TYPE.


+    case TEMPLATE_ID_TYPE:
+      if (!BOUND_TEMPLATE_TEMPLATE_PARM_P (t1))
+	{
+	  if (!cp_tree_equal (TYPE_TI_TEMPLATE (t1),
+			      TYPE_TI_TEMPLATE (t2)))
+	    return false;
+	  return comp_template_args (TYPE_TI_ARGS (t1),
+				     TYPE_TI_ARGS (t2));
+	}
+      else
+	{
+	  /* Fall through.  */;
+	}

Should handle all TEMPLATE_ID_TYPE the same.


     case UNION_TYPE:
       if (TYPE_TEMPLATE_INFO (t1) && TYPE_TEMPLATE_INFO (t2)
 	  && (TYPE_TI_TEMPLATE (t1) == TYPE_TI_TEMPLATE (t2)
-	      || TREE_CODE (t1) == BOUND_TEMPLATE_TEMPLATE_PARM)
+	      || BOUND_TEMPLATE_TEMPLATE_PARM_P (t1))
 	  && comp_template_args (TYPE_TI_ARGS (t1), TYPE_TI_ARGS (t2)))

Should handle all TEMPLATE_ID_TYPE.


Jason


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]