]> gcc.gnu.org Git - gcc.git/commitdiff
pt.c (process_template_parm): Accept TYPENAME_TYPE nodes.
authorKriang Lerdsuwanakij <lerdsuwa@scf.usc.edu>
Tue, 26 May 1998 23:54:23 +0000 (23:54 +0000)
committerJason Merrill <jason@gcc.gnu.org>
Tue, 26 May 1998 23:54:23 +0000 (19:54 -0400)
* pt.c (process_template_parm): Accept TYPENAME_TYPE nodes.
(convert_nontype_argument): Handle cases when nontype template
parameters become classes after substitution.

From-SVN: r20084

gcc/cp/ChangeLog
gcc/cp/pt.c

index f1249c8c4bdb7cc0ef18e9ef7007d3b674ee284a..2097bbf7d756f9496f1b7d7aeddf2db382364ed5 100644 (file)
@@ -1,3 +1,9 @@
+1998-05-26  Kriang Lerdsuwanakij  <lerdsuwa@scf.usc.edu>
+
+       * pt.c (process_template_parm): Accept TYPENAME_TYPE nodes.
+       (convert_nontype_argument): Handle cases when nontype template
+       parameters become classes after substitution.
+
 1998-05-26  Mark Mitchell  <mark@markmitchell.com>
 
        * friend.c (is_friend): Use comptypes, rather than == to compare
index dd7060ad43fa74dadf5120726c225fc48917036d..509aa15a3d3a1b4bf5d0e4dc025c3a49fae9c79f 100644 (file)
@@ -1382,7 +1382,8 @@ process_template_parm (list, next)
       /* A template parameter is not modifiable.  */
       TREE_READONLY (parm) = 1;
       if (IS_AGGR_TYPE (TREE_TYPE (parm))
-         && TREE_CODE (TREE_TYPE (parm)) != TEMPLATE_TYPE_PARM)
+         && TREE_CODE (TREE_TYPE (parm)) != TEMPLATE_TYPE_PARM
+         && TREE_CODE (TREE_TYPE (parm)) != TYPENAME_TYPE)
        {
          cp_error ("`%#T' is not a valid type for a template constant parameter",
                    TREE_TYPE (parm));
@@ -2232,7 +2233,13 @@ convert_nontype_argument (type, expr)
        tree fns;
        tree fn;
 
-       my_friendly_assert (TYPE_PTRMEMFUNC_P (type), 0);
+       if (!TYPE_PTRMEMFUNC_P (type))
+         /* This handles templates like
+              template<class T, T t> void f();
+            when T is substituted with any class.  The second template
+            parameter becomes invalid and the template candidate is
+            rejected.  */
+         return error_mark_node;
 
        /* For a non-type template-parameter of type pointer to member
           function, no conversions apply.  If the template-argument
This page took 0.083217 seconds and 5 git commands to generate.